2009-08-11 59 views
7

我有這樣的一個表:排名的學生按年級

 
Date  StudentName Score 

01.01.09 Alex   100 
01.01.09 Tom   90 
01.01.09 Sam   70 
01.02.09 Alex   100 
01.02.09 Tom   50 
01.02.09 Sam   100 

我需要得分不同的日期內排名在結果表中的學生,像這樣:

 
Date  Student   Rank 

01.01.09 Alex    1 
01.01.09 Tom    2 
01.01.09 Sam    3 
01.02.09 Alex    1 
01.02.09 Sam    1 
01.02.09 Tom    2 

如何我可以在SQL中執行此操作嗎?

回答

28

您想使用的功能rank在T-SQL:

select 
    date, 
    student, 
    rank() over (partition by date order by score desc) as rank 
from 
    grades 
order by 
    date, rank, student 

神奇的是over子句。看到它將這些排名拆分爲date,然後通過score對這些子集進行排序。輝煌,呃?

+1

+1好的答案,你每天都會學到新的東西:) – 2009-08-11 21:00:50

+0

+1 - 是的,從未聽說過'排名' – 2009-08-11 21:04:06

+0

'over'子句是驚人的。你可以用'partition by'來做任何聚合函數。非常整齊的東西。 – Eric 2009-08-11 21:10:19

1

你應該使用ORDER BY

SELECT * FROM Students ORDER BY Date,Rank 

這將責令按日期數據,然後排名。您可以根據需要添加儘可能多的字段,只要它們具有可比性即可(無法比較BLOB或長文本字段)。

希望有所幫助。

-1

你需要編寫一個函數,將計算機等級爲給定的學生和日期。然後你可以「OrderDER Date,Rank()」

+1

這是一個非常糟糕的主意。 rank()函數需要查詢表格,並且我知道sql server不會將它合併到查詢中(儘管對其他DBMS不太確定,但它會讓我感到意外)。 – erikkallen 2009-08-11 21:51:37