分组依据:如果我不想在列上执行聚合函数该怎么办?

时间:2016-11-16 16:04:10

标签: sql sql-server tsql sql-server-2012

我有一张桌子,学生,有以下栏目:

________________________________________________
| 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。

你知道怎么解决吗?

2 个答案:

答案 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;