2009-08-11 19 views
7

Mam tabeli jak poniżej:Studenci ranking według stopnia w 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 

muszę oceniającym studentów w tabeli wyników przez wynik ramach różnych terminach, na przykład:

 
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 

Jak czy mogę to zrobić w SQL?

Odpowiedz

28

Chcesz skorzystać z funkcji rank w T-SQL:

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

Magia jest w klauzuli over. Zobacz, dzieli te rankingi na date, a następnie zamawia te podzbiory przez score. Świetnie, co?

+1

+ 1 fajna odpowiedź, każdego dnia uczysz się czegoś nowego :) –

+0

+1 - tak, nigdy nie słyszałem o "rankingu" –

+0

Klauzula 'over' jest niesamowita. Możesz wykonać dowolną funkcję agregującą za pomocą 'partition by'. Bardzo fajne rzeczy. – Eric

1

Należy użyć ORDER BY:

SELECT * FROM Students ORDER BY Date,Rank 

To będzie zamówić dane według daty, a następnie pozycję. Możesz dodać dowolną liczbę pól, o ile są one porównywalne (nie możesz porównywać obiektów BLOB lub długich pól tekstowych).

Nadzieję, że pomaga.

-1

trzeba napisać funkcję, która będzie komputer rangę dla danego studenta i datą. Wtedy możesz "ORDER BY Date, Rank()"

+1

To jest bardzo zły pomysł. Funkcja rank() musiałaby skonsultować się z tabelą i wiem, że serwer sql nie połączy go z zapytaniem (nie jestem pewien co do innych DBMS, ale to by mnie zaskoczyło). – erikkallen

Powiązane problemy