ウィンドウ関数 レッスン2
RANK・DENSE_RANK
同率順位を扱うRANKとDENSE_RANKの違いを学びます。
RANK vs DENSE_RANK vs ROW_NUMBER
3つの順位関数はいずれも順位を付けますが、同率(タイ)の扱いが異なります。 スポーツの順位表や売上ランキングなど、同点がある場面での使い分けが重要です。
- ROW_NUMBER — 同率でも必ず1,2,3(重複なし)
- RANK — 同率は同じ順位、次は飛び番(1,1,3,4)
- DENSE_RANK — 同率は同じ順位、次は連続番(1,1,2,3)
例1: 3つの順位関数を比較する
テーブル定義
CREATE TABLE students ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, score INTEGER NOT NULL ); INSERT INTO students VALUES (1, '田中太郎', 85); INSERT INTO students VALUES (2, '鈴木花子', 92); INSERT INTO students VALUES (3, '佐藤一郎', 78); INSERT INTO students VALUES (4, '山田二郎', 92); INSERT INTO students VALUES (5, '伊藤花代', 85); INSERT INTO students VALUES (6, '渡辺次郎', 70);
SQLエディタ
例2: 部門別ランキング
テーブル定義
CREATE TABLE employees ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, department TEXT NOT NULL, salary INTEGER NOT NULL ); INSERT INTO employees VALUES (1, '田中太郎', '営業部', 400000); INSERT INTO employees VALUES (2, '鈴木花子', '開発部', 520000); INSERT INTO employees VALUES (3, '佐藤一郎', '営業部', 400000); INSERT INTO employees VALUES (4, '山田二郎', '開発部', 480000); INSERT INTO employees VALUES (5, '伊藤花代', '営業部', 450000); INSERT INTO employees VALUES (6, '渡辺次郎', '開発部', 520000);
SQLエディタ
例3: 上位N位を取得する
テーブル定義
CREATE TABLE employees ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, department TEXT NOT NULL, salary INTEGER NOT NULL ); INSERT INTO employees VALUES (1, '田中太郎', '営業部', 400000); INSERT INTO employees VALUES (2, '鈴木花子', '開発部', 520000); INSERT INTO employees VALUES (3, '佐藤一郎', '営業部', 450000); INSERT INTO employees VALUES (4, '山田二郎', '開発部', 480000); INSERT INTO employees VALUES (5, '伊藤花代', '営業部', 380000); INSERT INTO employees VALUES (6, '渡辺次郎', '開発部', 520000);
SQLエディタ