Обмежте результати першими двома рядками рейтингу


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пункті.
Йон усіх торгів


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

Для Терадари ви також можете:

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

3
Що ж, це може бути добре, але питання стосується саме SQL Server.
деззо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.