Limita i risultati alle prime 2 righe di classificazione


22

In SQL Server 2008, sto usando RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)per restituire set di dati con RANK. Ma ho centinaia di record per ogni partizione, quindi otterrò i valori dal rango 1, 2, 3 ...... 999. Ma voglio solo un massimo di 2 RANKsin ciascuno PARTITION.

Esempio:

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

Voglio che il risultato sia:

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

Voglio solo gradi 1 e 2 in ogni categoria. Come faccio a fare questo?

Risposte:


15

È possibile inserire la query originale rank()in una sottoquery e racchiuderla in una query che filtra i risultati.


Ha senso. Vorrei che Microsoft lo rendesse più semplice, cioè inserisse un numero nella funzione RANK. RANK(2) OVER (PARTITION BY Col2 ORDER B Y Col3) AS Top_2_Ranks. Può succedere che accadrà nelle versioni future. Grazie per l'idea però.
UB01,

@ UB01: O meglio ancora, sarebbe bello usare funzioni con finestre in una WHEREclausola.
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

Penso che il modo per farlo in SQL Server sia combinare la funzione finestra con un'espressione di tabella comune:

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

Per Teradara in alternativa puoi fare:

SELECT 
Subject, 
Name, 
RANK() OVER (PARTITION BY Subject ORDER BY Score DESC) as RN
FROM Table
QUALIFY a.RN <= 2

3
Bene, potrebbe essere tutto a posto, ma la domanda riguarda specificamente SQL Server.
dezso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.