Dans SQL Server 2008, j'utilise RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)
pour renvoyer l'ensemble de données avec RANK
. Mais j'ai des centaines d'enregistrements pour chaque partition, donc j'obtiendrai des valeurs de rang 1, 2, 3 ...... 999. Mais je veux seulement jusqu'à 2 RANKs
dans chacun PARTITION
.
Exemple:
ID Name Score Subject
1 Joe 100 Math
2 Jim 99 Math
3 Tim 98 Math
4 Joe 99 History
5 Jim 100 History
6 Tim 89 History
7 Joe 80 Geography
8 Tim 100 Geography
9 Jim 99 Geography
Je veux que le résultat soit:
SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC)
FROM Table
Subject Name Rank
Math Joe 1
Math Jim 2
History Jim 1
History Joe 2
Geography Tim 1
Geography Jim 2
Je veux seulement les classements 1 et 2 dans chaque catégorie. Comment puis-je faire cela?
RANK(2) OVER (PARTITION BY Col2 ORDER B Y Col3) AS Top_2_Ranks
. Peut-être que cela se produira dans les prochaines versions. Merci pour l'idée.WHERE
clause.la source
Je pense que la façon de le faire dans SQL Server est de combiner la fonction window avec une expression de table commune:
la source
Pour Teradara, vous pouvez également faire:
la source