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のみが欲しい。どうすればよいですか?
rank()
を使用して元のクエリをサブクエリに入れ、結果をフィルターするクエリでラップすることができます。
select * from (
SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC) as RN
FROM Table
) a
where a.RN <= 2
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