it-swarm.asia

قصر النتائج على أول صفين

في 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 في كل فئة. كيف أقوم بهذا العمل؟

23
UB01

يمكنك وضع الاستعلام الأصلي باستخدام rank() في استعلام فرعي ولفه باستعلام يقوم بتصفية النتائج.

15
ConcernedOfTunbridgeWells
select * from (
SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC) as RN
FROM Table
) a
where a.RN <= 2
17
Derek Kromm

أعتقد أن طريقة القيام بذلك في 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
0
josebrwn