SQLでデータに順位を付けたいとき、よく使われるのが RANK と DENSE_RANK です。
どちらもウィンドウ関数として利用でき、同点がある場合にどう順位を振るかが異なります。
「売上ランキングを作りたい」「部門ごとのTOP3を出したい」といった実務シーンでは、両者の違いを理解していないと期待通りの結果にならないことがあります。
本記事では、RANKとDENSE_RANKの基本的な違い を解説したうえで、実務での使い分け方、さらに DBMSごとのサポート状況 までわかりやすく紹介します。
RANKとは?
RANK は、同点がある場合に同じ順位を付けますが、その分次の順位が飛びます。
例:テストの点数ランキング
👉 2位が2人いるため、次の順位は「4位」となります。
DENSE_RANKとは?
DENSE_RANK は、同点の場合も同じ順位を付けますが、次の順位は飛ばさずに連続します。
👉 2位が2人いても、次の順位は「3位」となります。
実務での便利な活用例
1. 売上ランキングを作る
売上データから各商品の順位を求めたいときは DENSE_RANK が便利です。
2. 部門別ランキングを作る
「部門ごとにランキングを出したい」場合は、PARTITION BY
を組み合わせます。
3. TOP Nの商品を抽出する
「売上TOP3の商品を取得したい」といった場合は注意が必要です。
DENSE_RANK なら「必ず3位まで」に限定できるため安全です。
DBMSごとの違い
Oracle Database
-
RANK / DENSE_RANK ともに早期からサポート
-
標準SQLに準拠し、安定して利用可能
PostgreSQL
-
バージョン8.4以降でサポート
-
標準SQL準拠のため、OracleやSQL Serverとほぼ同じ書き方で利用できる
MySQL
-
MySQL 8.0 以降で利用可能
-
それ以前(5.x系など)では未対応で、ユーザー変数を使った代替実装が必要
SQL Server (Microsoft)
-
2005以降でサポート
-
標準SQLと同じ感覚で利用可能
👉 まとめると:
-
Oracle / PostgreSQL / SQL Server → そのまま使える
-
MySQL 8.0以降 → 標準対応
-
MySQL 5.x以前 → 対応なし(代替実装が必要)
まとめ
-
RANK → 同順位があると次の順位が飛ぶ(例:1,2,2,4)
-
DENSE_RANK → 順位が連続(例:1,2,2,3)
-
実務での使い分け:
-
売上ランキング → DENSE_RANK
-
部門別の表彰や順位 → RANK
-
TOP N抽出 → DENSE_RANK が安全
-
-
DBMSによってサポート状況が異なるため、特にMySQLはバージョンを確認することが重要
SQLでのランキング処理はシーンによって適切に関数を選ぶのがコツです。