2010-05-05 5 views
3

J'utilise SQL Server 2008. J'ai une table Étudiant dans lequel il y a des champs suivants: 1. StudentId, 2. StudentName, 3. Marques. Je veux obtenir un ensemble de résultats dans lequel il devrait y avoir une colonne nommée "Position". Quelque chose comme "Select StudentId, StudentName, marques, comme position de l'étudiant ..." de sorte que, selon les notes d'un étudiant a marqué, je peux les évaluer comme la 1ère, 2e ou 20e position. Si les élèves ont les mêmes notes, ils ont la même position. Merci. RhysSQL Server: position basée sur les marques

Répondre

7

Utilisation RANK:

Si deux ou plusieurs lignes à égalité pour un rang, chaque lignes liées reçoit le même rang. Par exemple, si les deux meilleurs vendeurs ont la même valeur SalesYTD, ils sont tous deux classés au premier rang. Le vendeur avec le SalesYTD suivant le plus élevé est classé numéro trois, car il y a deux lignes qui sont classées plus haut. Par conséquent, la fonction RANK ne renvoie pas toujours des entiers consécutifs.

La requête pourrait ressembler à ceci:

SELECT 
    StudentId, 
    StudentName, 
    Marks, 
    RANK() OVER (ORDER BY Marks DESC) AS Position 
FROM Student 
+1

Voici la documentation MSDN pour les fonctions de classement: http://msdn.microsoft.com/en-us/library/ms189798.aspx – David

+0

+1 parfait, je pensais ROW_NUMBER(), mais RANK() gère parfaitement les marques dupliquées –

1

Vous pouvez utiliser une sous-requête pour calculer la position. La position est tout simplement un de plus que le nombre d'étudiants avec une note supérieure:

select 
    s.StudentId, s.StudentName, s.Marks, 
    Position = 1 + (select count(*) from Students m where m.Marks > s.Marks) 
from 
    Students s 
+0

Merci pour la réponse rapide simple. Cela l'a fait pour moi. J'ai aussi réalisé que la fonction DENSE_RANK() proposée par Mark Byers ci-dessus fait aussi l'affaire. :-) – Rhys

Questions connexes