결과를 처음 2 개의 순위 행으로 제한


22

SQL Server 2008에서는 RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)로 데이터 세트를 반환하는 데 사용하고 RANK있습니다. 그러나 각 파티션마다 수백 개의 레코드가 있으므로 순위 1, 2, 3 ...... 999에서 값을 가져옵니다. 하지만 RANKs각각 최대 2 개만 원합니다 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()하위 쿼리에 넣고 결과를 필터링하는 쿼리로 래핑 할 수 있습니다.


맞는 말이다. 마이크로 소프트가 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

-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.