PR

【SQL】rank関数の使い方/コツを1分でわかりやすく解説

Database

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の基本構文ルール

スポンサーリンク

rank関数とは?

RANK()関数は、SQLの中でデータの順番(ランキング)をつけるためのツールです。たとえば、試験の点数が高い順に1位、2位、3位…と順番をつけたいときに使います。同じ点数の場合、同じ順位をつけて、次の順位はスキップします。例: 1位、2位、2位、4位… という風になります。

シンプルに言えば、「どのデータが上位なのか、下位なのか」を教えてくれる関数です。

rank関数:構文ルール

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

rank関数の利用例

ここからは実際にrank関数を利用するサンプルを見ていきながら、注意点やTipsなどをご説明していきます。

サンプル1 売上が高い順にランキングをつける

名前売上
Aさん1000
Bさん1500
Cさん900
Dさん1500
売上テーブル
SELECT 名前, 売上, RANK() OVER (ORDER BY 売上 DESC) AS ランキング
FROM 売上テーブル;

結果

名前売上ランキング
Bさん15001
Dさん15001
Aさん10003
Cさん9004

「売上」列に同じ値がある場合は、どちらも同じ順位で表示されるという点を押さえておきましょう。

サンプル2 都道府県ごとの売上が高い順にランキング

都道府県名前売上
東京Aさん1000
東京Bさん1500
大阪Cさん1300
大阪Dさん1100
売上テーブル
SELECT 都道府県, 名前, 売上, RANK() OVER (PARTITION BY 都道府県 ORDER BY 売上 DESC) AS ランキング
FROM 売上テーブル;

結果

都道府県名前売上ランキング
東京Bさん15001
東京Aさん10002
大阪Cさん13001
大阪Dさん11002

「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さん15001
1月Aさん10002
2月Cさん13001
2月Dさん11002

今度は「PARTITION BY 月」としているため、月別に売上が高いレコード順にランクされている点がポイント。

rank関数のまとめ

RANK() OVER (
    PARTITION BY <分割列>
    ORDER BY <並び替え列>
  1. 重複値の扱い: RANK()関数は同じ値を持つ行に同じランキングを割り当てる。次のランキングは、重複した行数をスキップして進められる。
    • 例: 1, 2, 2, 4(「3」はスキップ)
  2. PARTITION BY:
    • PARTITION BYを使用すると、指定されたカラムの値ごとにランキングをリセットして計算される。
  3. ORDER BY:
    • ランキングの順序を決定するカラムを指定。
    • 昇順(ASC)または降順(DESC)を指定。デフォルトは昇順。
  4. window関数:
    • RANK()はwindow関数の一つです。window関数は、結果セット内の行のサブセット(ウインドウ)に関数を適用するためのもの。
  5. フレーム指定不要:
    • RANK()関数の場合、フレーム範囲の指定は必要ない。
  6. 他のランキング関数との違い:
    • RANK()と似た関数にDENSE_RANK()ROW_NUMBER()がある→それぞれの関数でランキングの付け方や重複値の扱いが異なるため注意。

SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。

SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?

とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
DatabaseIT-Skills
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました