2016-11-16 51 views
0

我有一个表,学生,有以下栏目:分组:如果我不想在列上执行聚合函数,该怎么办?

________________________________________________ 
| id | name | class | date_registrered | 
------------------------------------------------ 

我想选择一个行对每个唯一的类,只有排在date_registrered最大的价值, 即我要选择为每个班级提供最新的注册学生,包括该课程的所有数据。

我想:

SELECT id, name, class, MAX(date_registrered) 
FROM Students 
GROUP BY class; 

我得到以下错误:

Column 'Students.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

This question on SO这不会忽略问题的简化版本。但是,该示例仅适用于2列。

我只想按类分组,我只想在date_registrered上执行一个聚合函数。我也想显示所有其他列与每个类的max date_registrered行。

你知道如何解决它吗?

+0

如果两个学生每节课*还没有明确的意义登记在同一天,*最新的注册学生。至少不是在每个独特类中返回一行的情况下。 –

+0

时间以毫秒为单位,所以它的罚款为 – hellogoodnight

+0

在这种情况下,“date_registered”值得一个更深思熟虑的名字。 –

回答

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; 
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 
相关问题