Ограничить результаты до первых 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 в каждой категории. Как мне это сделать?

UB01
источник

Ответы:

15

Вы можете поместить исходный запрос с использованием rank()в подзапрос и обернуть его запросом, который фильтрует результаты.

ConcernedOfTunbridgeWells
источник
Имеет смысл. Я хотел бы, чтобы Microsoft сделала это более простым, то есть поместила число в функцию RANK. RANK(2) OVER (PARTITION BY Col2 ORDER B Y Col3) AS Top_2_Ranks, Может быть, это произойдет в будущих выпусках. Спасибо за идею, хотя.
UB01
@ UB01: Или еще лучше, было бы неплохо использовать оконные функции в WHEREпредложении.
Джон на все руки
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

Я думаю, что способ сделать это в 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
josebrwn
источник
-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.
Дезсо