RANK()関数は、結果セットの中の各行に一意の順序付けを提供するウインドウ関数です。
参考 ウインドウ関数とは?
この関数は、同じ値を持つ行には同じランクを付け、次の行にはその数だけスキップしてランクを付けます。例えば、ランキングが「1,2,2,4」となることがあります。
CREATE TABLE sales (
id INT,
salesperson VARCHAR(50),
city VARCHAR(50),
amount INT
);
INSERT INTO sales VALUES
(1, 'Alice', 'Tokyo', 200),
(2, 'Bob', 'Tokyo', 350),
(3, 'Charlie', 'Tokyo', 200),
(4, 'David', 'Osaka', 400),
(5, 'Eva', 'Osaka', 150),
(6, 'Frank', 'Osaka', 400);
-- 都市ごとの売上ランキングを取得
SELECT city, salesperson, amount,
RANK() OVER (PARTITION BY city ORDER BY amount DESC) AS ranking_within_city
FROM sales;
/* 結果
+---------+-------------+--------+---------------------+
| city | salesperson | amount | ranking_within_city |
+---------+-------------+--------+---------------------+
| Tokyo | Bob | 350 | 1 |
| Tokyo | Alice | 200 | 2 |
| Tokyo | Charlie | 200 | 2 |
| Osaka | David | 400 | 1 |
| Osaka | Frank | 400 | 1 |
| Osaka | Eva | 150 | 3 |
+---------+-------------+--------+---------------------+
*/

このページではrank関数の使い方を1からわかりやすくサンプルコード付きでご説明します。
プログラマーやシステムエンジニアを目指す方であれば知らないと恥ずかしい基本知識です。是非最後までご覧ください。
rank関数とは?
RANK()関数は、SQLの中でデータの順番(ランキング)をつけるためのツールです。たとえば、試験の点数が高い順に1位、2位、3位…と順番をつけたいときに使います。同じ点数の場合、同じ順位をつけて、次の順位はスキップします。例: 1位、2位、2位、4位… という風になります。

シンプルに言えば、「どのデータが上位なのか、下位なのか」を教えてくれる関数です。
rank関数:構文ルール
RANK() OVER (
PARTITION BY <分割列>
ORDER BY <並び替え列>
- RANK()
RANK()関数を利用します!という宣言部分。
- PARTITION BY <分割列>
- データを
<分割列>の値に基づいてグループ化(パーティション化)します。これにより、各グループ内でRANK()関数が独立して計算されます。
- データを
- ORDER BY <並び替え列>
<並び替え列>を基準にして、ランキングの順序を決定します。例えば、スコアのカラムを基準にして高い順にランキングをしたい場合、スコアのカラムを指定します。

window関数の基本的な構文ルールや詳細(PARTITION/ORDERなど)は以下の記事をご覧ください。
rank関数の利用例
ここからは実際にrank関数を利用するサンプルを見ていきながら、注意点やTipsなどをご説明していきます。
サンプル1 売上が高い順にランキングをつける
| 名前 | 売上 |
|---|---|
| Aさん | 1000 |
| Bさん | 1500 |
| Cさん | 900 |
| Dさん | 1500 |
SELECT 名前, 売上, RANK() OVER (ORDER BY 売上 DESC) AS ランキング FROM 売上テーブル;
結果
| 名前 | 売上 | ランキング |
|---|---|---|
| Bさん | 1500 | 1 |
| Dさん | 1500 | 1 |
| Aさん | 1000 | 3 |
| Cさん | 900 | 4 |

「売上」列に同じ値がある場合は、どちらも同じ順位で表示されるという点を押さえておきましょう。
サンプル2 都道府県ごとの売上が高い順にランキング
| 都道府県 | 名前 | 売上 |
|---|---|---|
| 東京 | Aさん | 1000 |
| 東京 | Bさん | 1500 |
| 大阪 | Cさん | 1300 |
| 大阪 | Dさん | 1100 |
SELECT 都道府県, 名前, 売上, RANK() OVER (PARTITION BY 都道府県 ORDER BY 売上 DESC) AS ランキング FROM 売上テーブル;
結果
| 都道府県 | 名前 | 売上 | ランキング |
|---|---|---|---|
| 東京 | Bさん | 1500 | 1 |
| 東京 | Aさん | 1000 | 2 |
| 大阪 | Cさん | 1300 | 1 |
| 大阪 | Dさん | 1100 | 2 |

「PARTITION BY 都道府県」と指定しているため、都道府県ごとにランク付けされているのがポイントです。
サンプル3 月ごとの売上が高い順にランキング
| 月 | 名前 | 売上 |
|---|---|---|
| 1月 | Aさん | 1000 |
| 1月 | Bさん | 1500 |
| 2月 | Cさん | 1300 |
| 2月 | Dさん | 1100 |
SELECT 月, 名前, 売上, RANK() OVER (PARTITION BY 月 ORDER BY 売上 DESC) AS ランキング FROM 売上テーブル;
結果
| 月 | 名前 | 売上 | ランキング |
|---|---|---|---|
| 1月 | Bさん | 1500 | 1 |
| 1月 | Aさん | 1000 | 2 |
| 2月 | Cさん | 1300 | 1 |
| 2月 | Dさん | 1100 | 2 |

今度は「PARTITION BY 月」としているため、月別に売上が高いレコード順にランクされている点がポイント。
rank関数のまとめ
SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。

SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?
とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。


