web-dev-qa-db-ja.com

結果を最初の2つのランキング行に制限する

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のみが欲しい。どうすればよいですか?

23
UB01

rank()を使用して元のクエリをサブクエリに入れ、結果をフィルターするクエリでラップすることができます。

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