Ogranicz wyniki do pierwszych 2 rzędów rankingu

22

W SQL Server 2008 używam RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)do zwracania zestawu danych za pomocą RANK. Ale mam setki rekordów dla każdej partycji, więc otrzymam wartości od rangi 1, 2, 3 ...... 999. Ale chcę tylko do 2 RANKsw każdym PARTITION.

Przykład:

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

Chcę, aby wynik był:

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

Chcę tylko rangi 1 i 2 w każdej kategorii. Jak mam to zrobic?

UB01
źródło

Odpowiedzi:

15

Możesz umieścić oryginalne zapytanie za pomocą rank()w podzapytaniu i zawinąć je w zapytanie, które filtruje wyniki.

ConcernedOfTunbridgeWells
źródło
Ma sens. Chciałbym, żeby Microsoft uprościł, tzn. Wstawił liczbę w funkcji RANK. RANK(2) OVER (PARTITION BY Col2 ORDER B Y Col3) AS Top_2_Ranks. Może tak się stanie w przyszłych wydaniach. Dzięki za pomysł.
UB01
@ UB01: Lub jeszcze lepiej, byłoby fajnie użyć funkcji okienkowanych w WHEREklauzuli.
Jon of All Trades
16
select * from (
SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC) as RN
FROM Table
) a
where a.RN <= 2
Derek Kromm
źródło
0

Myślę, że sposobem na to w SQL Server jest połączenie funkcji okna ze wspólnym wyrażeniem tabelowym:

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
josebrwn
źródło
-1

W przypadku Teradary alternatywnie możesz:

SELECT 
Subject, 
Name, 
RANK() OVER (PARTITION BY Subject ORDER BY Score DESC) as RN
FROM Table
QUALIFY a.RN <= 2
Dimitar Nentchev
źródło
3
Cóż, to może być w porządku, ale pytanie dotyczy konkretnie SQL Servera.
dezso,