จำกัด ผลลัพธ์ให้อยู่ในแถวที่ 2 อันดับแรก


22

ใน SQL Server 2008 ฉันใช้เพื่อกลับชุดข้อมูลที่มีRANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC) RANKแต่ฉันมีหลายร้อยเร็กคอร์ดสำหรับแต่ละพาร์ติชันดังนั้นฉันจะได้รับค่าจากอันดับ 1, 2, 3 ...... 999 แต่ฉันต้องการได้มากถึง 2 RANKsในแต่ละPARTITIONครั้ง

ตัวอย่าง:

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

ฉันต้องการผลลัพธ์ที่จะเป็น:

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

ฉันต้องการอันดับที่ 1 และ 2 ในแต่ละหมวดหมู่เท่านั้น ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


15

คุณสามารถใส่คิวรีดั้งเดิมที่ใช้rank()ลงในคิวรีย่อยแล้วล้อมด้วยคิวรีที่กรองผลลัพธ์


มีเหตุผล. ฉันหวังว่า Microsoft จะทำให้มันง่ายขึ้นเช่นใส่หมายเลขในฟังก์ชัน RANK RANK(2) OVER (PARTITION BY Col2 ORDER B Y Col3) AS Top_2_Ranks. อาจจะเกิดขึ้นในอนาคต ขอบคุณสำหรับความคิดที่ว่า
UB01

@ UB01: หรือดีกว่ายังเป็นการดีที่จะใช้ฟังก์ชั่นแบบหน้าต่างในส่วนWHEREคำสั่ง
Jon of All Trades


0

ฉันคิดว่าวิธีการทำเช่นนี้ใน SQL Server คือการรวมฟังก์ชั่นหน้าต่างกับการแสดงออกของตารางทั่วไป:

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 หรือคุณสามารถทำได้:

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

3
นั่นอาจจะใช้ได้ แต่คำถามนั้นเกี่ยวกับ SQL Server โดยเฉพาะ
dezso
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.