2009-08-11 30 views
7

Tôi có một bảng như thế này:Học sinh Ranking bởi lớp trong SQL

 
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 

tôi cần để xếp hạng các sinh viên trong bảng kết quả theo điểm số trong những ngày khác nhau, như thế này:

 
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 

thế nào tôi có thể làm điều này trong SQL?

Trả lời

28

Bạn muốn sử dụng các chức năng rank trong T-SQL:

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

Sự kỳ diệu là trong mệnh đề over. Hãy xem, nó chia nhỏ các thứ hạng đó theo date và sau đó đặt hàng các tập hợp con đó theo score. Rực rỡ, eh?

+1

+1 câu trả lời hay, bạn học điều gì đó mới mỗi ngày :) –

+0

+1 - yep, không bao giờ nghe nói về 'xếp hạng' –

+0

Điều khoản' over' thật tuyệt vời. Bạn có thể thực hiện bất kỳ hàm tổng hợp nào với một 'phân vùng bằng'. Những thứ rất gọn gàng. – Eric

1

Bạn nên sử dụng ORDER BY:

SELECT * FROM Students ORDER BY Date,Rank 

Điều đó sẽ đặt hàng các dữ liệu theo ngày, sau đó xếp hạng. Bạn có thể thêm bao nhiêu trường tùy thích, miễn là chúng có thể so sánh được (bạn không thể so sánh BLOB hoặc trường văn bản dài).

Hy vọng điều đó sẽ hữu ích.

-1

Bạn cần phải viết một chức năng mà sẽ máy tính thứ hạng cho một sinh viên nhất định và ngày. Sau đó, bạn có thể "ORDER BY Date, Rank()"

+1

Đây là một ý tưởng cực kỳ tồi tệ. Hàm rank() sẽ cần tham khảo bảng, và tôi biết rằng máy chủ sql sẽ không hợp nhất nó vào truy vấn (không chắc chắn về các DBMS khác, nhưng nó sẽ làm tôi ngạc nhiên). – erikkallen

Các vấn đề liên quan