【SQL応用】ランキング集計で悩まない!WINDOW関数(RANK, DENSE_RANK, ROW_NUMBER)の使い分け完全ガイド
公開日: 2025年11月27日
「今月の売上ランキングを作って」 「各部門ごとの最高得点者を出して」
実務でこのような依頼を受けたとき、あなたはどのように対応していますか? まさか、一度全データをSELECT *で取得してから、PythonやJavaのプログラム側でソートして順位をつけてはいませんよね?
SQLには、集計を行いつつ、個別の行のデータも保持できる魔法の機能、「ウィンドウ関数(Window Functions)」が存在します。 今日はその中でも、特に混同しやすい3つの順位付け関数(RANK, DENSE_RANK, ROW_NUMBER)の決定的な違いを、ニッチに深掘りして解説します。
この記事を読めば、複雑なランキング集計もSQL一発で解決できるようになります。 ぜひ、当サイトのSQL道場で、実際の挙動を試しながら読み進めてください。
🤔 ウィンドウ関数とは? 「窓」を開けて覗く技術
通常のGROUP BYによる集計では、行がまとめられてしまい、個別のデータは見えなくなります。 しかし、ウィンドウ関数を使うと、「今の行(カレント行)」を保ったまま、特定の範囲(ウィンドウ)のデータを集計・分析できます。
構文のキーとなるのは OVER 句です。
-- 文法イメージ
関数名() OVER (PARTITION BY グループ化する列 ORDER BY 並び替える列)
🔥 3つのランキング関数の違い:同率順位の扱い
得点が同じ人がいた場合、どう順位をつけるか? この扱いの違いが、3つの関数の使い分けポイントです。以下のスコア表を例に見てみましょう。
スコアデータ: 100点, 100点, 90点, 80点
1. RANK():同率は同じ順位、次は飛ばす
最も一般的なランキングです。オリンピックなどでよく見ます。 1位が2人いたら、次は「3位」になります。
| Score | RANK() |
|---|---|
| 100 | 1 |
| 100 | 1 |
| 90 | 3 |
| 80 | 4 |
※「2位」が存在しなくなります。
2. DENSE_RANK():同率は同じ順位、次は飛ばさない
`DENSE`(密集した)という名の通り、順位を詰め込みます。 1位が2人いても、次は「2位」になります。
| Score | DENSE_RANK() |
|---|---|
| 100 | 1 |
| 100 | 1 |
| 90 | 2 |
| 80 | 3 |
※「上位3位以内に入った人」を抽出する時などに便利です。
3. ROW_NUMBER():同率でも強制的に連番
値が同じでも、問答無用で1, 2, 3...と番号を振ります。 ページング処理や、重複データの削除などに使われる、エンジニア好みの関数です。
| Score | ROW_NUMBER() |
|---|---|
| 100 | 1 |
| 100 | 2 |
| 90 | 3 |
| 80 | 4 |
※どちらが1位になるかは、DBの実装や他のソート条件に依存します。
🛠️ 実践クエリ:部門ごとのトップ社員を抽出する
では、実際にSQLを書いてみましょう。 「部署ごとの給与ランキング」を出すクエリです。
SELECT
name,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) as ranking
FROM
employees;
解説
- PARTITION BY department: 部署ごとにグループ分けしてランキングを計算します。
- ORDER BY salary DESC: 給与が高い順に並べます。
これだけで、A部署の1位、B部署の1位...を一発で取得できます。
まずはSQL道場で「SELECT」から始めよう
ウィンドウ関数は強力ですが、まずは基礎となる SELECT や ORDER BY が分かっていないと使いこなせません。
当サイトの「SQL練習ドリル(道場)」には、初心者から上級者まで、手を動かして学べる問題がたくさん用意されています。 まずは「初級編」や「中級編」で基礎体力をつけ、ゆくゆくはこのウィンドウ関数を使って、複雑なデータ分析にも挑戦してみてください。
まとめ
SQLは「データを取る」だけでなく、「データを分析する」ための強力なツールです。
- RANK(): 順位を飛ばす(1, 1, 3...)
- DENSE_RANK(): 順位を詰める(1, 1, 2...)
- ROW_NUMBER(): ユニークな連番(1, 2, 3...)
この違いを知っているだけで、集計業務の効率は何倍にも変わります。 さあ、SQL道場でクエリを書き、データの達人を目指しましょう!
SQLのスキルを試してみませんか?
「SQL練習ドリル(道場)」では、実際に手を動かしながらSQLをマスターできます。書いたクエリはAIが即座に採点・解説!まずは初級編からチャレンジ!
SQL道場に入門する →