我有一张桌子,学生,有以下栏目:
________________________________________________
| id | name | class | date_registrered |
------------------------------------------------
我想为每个唯一的类选择一行,而只在date_registrered中选择值最大的行, 即我想为每个班级选择最新的注册学生,包括该班级的所有数据。
我试过了:
SELECT id, name, class, MAX(date_registrered)
FROM Students
GROUP BY class;
我收到以下错误:
列'Students.id'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
This question on SO解决了此问题的简化版本。但是,该示例仅适用于2列。
我只想按类分组,我只想在date_registrered上执行聚合函数。我还想显示行的所有其他列,每个类都有max date_registrered。
你知道怎么解决吗?
答案 0 :(得分:2)
使用ROW_NUMBER()
SELECT *
FROM ( SELECT id, name, class, date_registrered
ROW_NUMBER() OVER (partition by class ORDER BY date_registrered DESC) rn
FROM Students
) T
WHERE T.rn = 1
答案 1 :(得分:2)
错误消息很好地解释了您的问题,您无法在一列上执行聚合,也无法使用GROUP BY
中的其余内容。在这种情况下,您希望使用ROW_NUMBER
:
WITH CTE AS
(
SELECT id,
name,
class,
date_registered,
RN = ROW_NUMBER() OVER(PARTITION BY class ORDER BY date_registrered DESC)
FROM students
)
SELECT id,
name,
class,
date_registered
FROM CTE
WHERE RN = 1;