2016-11-16 49 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 
相關問題