Batasi hasil untuk 2 baris peringkat pertama

22

Di SQL Server 2008, saya menggunakan RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)untuk mengembalikan kumpulan data dengan RANK. Tapi saya punya ratusan catatan untuk setiap partisi, jadi saya akan mendapatkan nilai dari peringkat 1, 2, 3 ...... 999. Tapi saya hanya ingin RANKsmasing-masing 2 orang PARTITION.

Contoh:

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

Saya ingin hasilnya:

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

Saya hanya ingin peringkat 1 dan 2 di setiap kategori. Bagaimana saya melakukan ini?

UB01
sumber

Jawaban:

15

Anda bisa memasukkan kueri asli menggunakan rank()ke dalam subquery dan membungkusnya dengan kueri yang menyaring hasil.

ConcernedOfTunbridgeWells
sumber
Masuk akal. Saya berharap Microsoft akan membuatnya lebih sederhana yaitu memasukkan nomor dalam fungsi RANK. RANK(2) OVER (PARTITION BY Col2 ORDER B Y Col3) AS Top_2_Ranks. Mungkin itu akan terjadi di rilis mendatang. Terima kasih untuk idenya.
UB01
@ UB01: Atau lebih baik lagi, akan menyenangkan untuk menggunakan fungsi berjendela dalam WHEREklausa.
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
sumber
0

Saya pikir cara untuk melakukan ini dalam SQL Server adalah dengan menggabungkan fungsi jendela dengan ekspresi tabel umum:

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
sumber
-1

Untuk Teradara, Anda dapat melakukannya:

SELECT 
Subject, 
Name, 
RANK() OVER (PARTITION BY Subject ORDER BY Score DESC) as RN
FROM Table
QUALIFY a.RN <= 2
Dimitar Nentchev
sumber
3
Yah, itu mungkin baik-baik saja, tetapi pertanyaannya adalah khusus tentang SQL Server.
dezso