MS-SQL / SQL Server
順位付け関数「RANK」、「DENSE_RANK」について
SQL SERVER 2005から使える順位付け関数「RANK」、「DENSE_RANK」!
順位付け関数には「ROW_NUMBER」もありますが、少し差があります。
では、テストの為にテーブルを作成してテストデータを登録しましょう。
-- #### テストテーブル作成
CREATE TABLE dbo.TempData
(
UserName varchar(10)
,Score int
)
-- #### テストデータ登録
INSERT INTO dbo.TempData (UserName, Score) VALUES ('AA', 100)
INSERT INTO dbo.TempData (UserName, Score) VALUES ('BB', 80)
INSERT INTO dbo.TempData (UserName, Score) VALUES ('CC', 90)
INSERT INTO dbo.TempData (UserName, Score) VALUES ('DD', 70)
INSERT INTO dbo.TempData (UserName, Score) VALUES ('EE', 90)
INSERT INTO dbo.TempData (UserName, Score) VALUES ('FF', 70)
INSERT INTO dbo.TempData (UserName, Score) VALUES ('GG', 60)
INSERT INTO dbo.TempData (UserName, Score) VALUES ('HH', 90)
-- #### 順位付けデータ確認
SELECT
ROW_NUMBER() OVER (ORDER BY Score DESC) AS [Row_Number]
, RANK() OVER (ORDER BY Score DESC) AS [Rank]
, DENSE_RANK() OVER (ORDER BY Score DESC) AS [Dense_Rank]
, UserName, Score
FROM dbo.TempData
実行結果
では、実行結果を見ながら説明したいと思います。
Scoreが高い順に順位付けをした結果となります。
「Row_Number」関数を使うと同じScoreでは別の順位が付けられました。
つまり、同値でも重複する順位を付けないのです。
「Rank」関数は同値の場合、同じ順位で付けます。
Scoreが90のCC,EE,HHのユーザーを見ると全部2位だと付けられています。
その2位の3名については2,3,4位を持っていることになりますので
次の順位は3位ではなく5位から始まることになります。
「Dense_Rank」関数はほぼ「Rank」関数と同じですが、
同値が存在する場合、次の順位に付けられるデータが違います。
Scoreが90のCC,EE,HHのユーザーを見ると「Rank」関数と同じく全部2位になっています。
次の順位は「Rank」関数では5位から始まりましたが、
「Dense_Rank」の場合、3位から始まります。
この差があります。