Sonuçları ilk 2 sıralama satırına sınırlayın


22

SQL Server 2008'de, RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)veri kümesini döndürmek için kullanıyorum RANK. Ancak her bölüm için yüzlerce kaydım var, bu yüzden 1., 2., 3. ve 9.999 arasındaki değerleri alacağım. Fakat RANKsher birinde sadece 2 taneye kadar istiyorum PARTITION.

Örnek:

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

Sonucun olmasını istiyorum:

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

Her kategoride sadece 1. ve 2. sırada yer almak istiyorum. Bunu nasıl yaparım?

Yanıtlar:


15

Orijinal sorguyu rank()bir alt sorguya yerleştirip sonuçları filtreleyen bir sorguyla sarabilirsiniz.


Mantıklı. Microsoft'un daha basit hale getirmesini diliyorum, yani RANK işlevine bir sayı koyun. RANK(2) OVER (PARTITION BY Col2 ORDER B Y Col3) AS Top_2_Ranks. Gelecek sürümlerde olacak olabilir. Yine de fikir için teşekkürler.
UB01

@ UB01: Ya da daha iyisi, pencerede fonksiyonların bir WHEREmaddede kullanılması iyi olurdu .
Tüm İşlemlerden Jon,

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

Bunu SQL Server'da yapmanın yolunun, pencere işlevini ortak bir tablo ifadesiyle birleştirmek olduğunu düşünüyorum:

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

Teradara için alternatif olarak şunları yapabilirsiniz:

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

3
Peki, bu iyi olabilir, ama soru özellikle SQL Server ile ilgili.
dezso,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.