SQLランキング関数:ROW_NUMBER、RANK、DENSE_RANKの違いと使い方

SQLにおいてデータをランク付けする場合、よく使われる関数にROW_NUMBER、RANK、DENSE_RANKがあります。しかし、これらの関数は似ているようでいて各々に独自の特性があります。この記事では、これらのランキング関数の違いと、それぞれの使い方について詳しく解説します。

目次

ランキング関数とは

ランキング関数はSQLのSELECT文で使用される関数であり、テーブル内の行を特定の順序でランク付けする役割があります。これにより、例えば「売上高が高い順にランク付け」や「成績が優秀な順にランク付け」など、データを意味のある順番で表示できます。

ROW_NUMBER、RANK、DENSE_RANKの違い

ROW_NUMBER、RANK、DENSE_RANKの三つのランキング関数はよく似ていますが、重複する値に対する挙動や、ランクの割り振り方に違いがあります。

基本的な挙動

関数名基本的な挙動
ROW_NUMBER重複無しで連続する数値を割り振る
RANK重複がある場合、同じランクを割り振り次のランクは飛ばす
DENSE_RANK重複がある場合、同じランクを割り振るが次のランクは飛ばさない
テーブル1:ランキング関数の基本的な挙動

具体的な例

假设我们有以下的一个「試験の点数」テーブルを考えます。

ID名前点数
1田中80
2山田90
3佐藤80
4鈴木85
テーブル2:試験の点数テーブル

このテーブルに各ランキング関数を適用すると、以下のようになります。

関数名ID名前点数ランク
ROW_NUMBER1田中802
ROW_NUMBER2山田901
ROW_NUMBER3佐藤803
ROW_NUMBER4鈴木854
RANK1田中802
RANK2山田901
RANK3佐藤802
RANK4鈴木853
DENSE_RANK1田中802
DENSE_RANK2山田901
DENSE_RANK3佐藤802
DENSE_RANK4鈴木853
テーブル3:ランキング関数を適用した場合の例

使い方

各ランキング関数の使い方は以下のようになります。

-- ROW_NUMBERの場合
SELECT ROW_NUMBER() OVER (ORDER BY 点数 DESC) as ランク, 名前, 点数 FROM 試験の点数;

-- RANKの場合
SELECT RANK() OVER (ORDER BY 点数 DESC) as ランク, 名前, 点数 FROM 試験の点数;

-- DENSE_RANKの場合
SELECT DENSE_RANK() OVER (ORDER BY 点数 DESC) as ランク, 名前, 点数 FROM 試験の点数;

まとめ

ROW_NUMBER、RANK、DENSE_RANKはSQLにおいてよく使われるランキング関数ですが、重複した値に対する処理が異なります。ROW_NUMBERは重

複を許さず、RANKは次のランクを飛ばし、DENSE_RANKは飛ばさないという違いがあります。適切なランキング関数を選ぶことで、より効率的なデータ処理が可能です。

コメント

コメントする

目次