結果を最初の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()して元のクエリをサブクエリに入れ、結果をフィルタリングするクエリでラップすることができます。


理にかなっています。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

代わりに、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.