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?

Odpowiedzi:


15

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


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

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

-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

3
Cóż, to może być w porządku, ale pytanie dotyczy konkretnie SQL Servera.
dezso,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.