2009-08-11 7 views
7

J'ai une table comme ceci:étudiants Classement par année dans 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 

J'ai besoin de classer les élèves dans le tableau des résultats par le score au sein des dates différentes, comme ceci:

 
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 

Comment puis-je faire cela en SQL?

Répondre

28

Vous voulez utiliser la fonction rank dans T-SQL:

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

La magie est dans la clause over. Voir, il divise ces classements par date, puis les commandes sous-ensembles de score. Brillant, hein?

+1

+1 bonne réponse, vous apprenez quelque chose de nouveau tous les jours :) –

+0

+1 - oui, jamais entendu parler de 'rank' –

+0

La clause' over' est incroyable. Vous pouvez faire n'importe quelle fonction d'agrégation avec une partition par. Des trucs très sympas. – Eric

1

Vous devez utiliser ORDER BY:

SELECT * FROM Students ORDER BY Date,Rank 

Ce commandera les données par date, puis le rang. Vous pouvez ajouter autant de champs que vous le souhaitez, à condition qu'ils soient comparables (vous ne pouvez pas comparer les objets BLOB ou les champs de texte longs).

Espérons que cela aide.

-1

Vous devez écrire une fonction qui ordinateur rang pour un étudiant et la date donnée. Alors vous pouvez "ORDER BY Date, Rank()"

+1

C'est une idée incroyablement mauvaise. La fonction rank() aurait besoin de consulter la table, et je sais que le serveur sql ne la fusionnera pas dans la requête (je ne suis pas sûr des autres SGBD, mais cela me surprendrait). – erikkallen

Questions connexes