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 chaque 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?
Vous pouvez placer la requête d'origine à l'aide de rank()
dans une sous-requête et l'encapsuler avec une requête qui filtre les résultats.
select * from (
SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC) as RN
FROM Table
) a
where a.RN <= 2
Je pense que la façon de le faire dans SQL Server est de combiner la fonction window avec une expression de table commune:
with cte as (
SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC) as ordinal
FROM Table
)
select * from cte where ordinal <= 2