🗃️SQLLearn
ウィンドウ関数 レッスン1

ROW_NUMBER

結果セットの各行に連番を付与するROW_NUMBER関数を学びます。

ウィンドウ関数とROW_NUMBER

ウィンドウ関数は、集約関数と異なり行を集約せず、各行に対して計算結果を返します。ROW_NUMBER()は、OVER句で指定した順序に従って各行に1から始まる連番を付与します。 同点でも必ず異なる番号が付くのが特徴です。

  • ROW_NUMBER() OVER (ORDER BY col) — 順序指定で連番
  • ROW_NUMBER() OVER (PARTITION BY grp ORDER BY col) — グループ別連番
  • 同順位でも必ず1,2,3...と連続する番号が付く

例1: 全体に連番を付ける

テーブル定義
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, '伊藤花代', 88);

例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, '佐藤一郎', '営業部', 450000);
INSERT INTO employees VALUES (4, '山田二郎', '開発部', 480000);
INSERT INTO employees VALUES (5, '伊藤花代', '人事部', 360000);
INSERT INTO employees VALUES (6, '渡辺次郎', '開発部', 500000);

例3: ROW_NUMBERで重複排除(最新1件のみ取得)

テーブル定義
CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  user_id INTEGER NOT NULL,
  product TEXT NOT NULL,
  order_date TEXT NOT NULL
);
INSERT INTO orders VALUES (1, 1, '商品A', '2024-01-10');
INSERT INTO orders VALUES (2, 1, '商品B', '2024-02-15');
INSERT INTO orders VALUES (3, 2, '商品C', '2024-01-20');
INSERT INTO orders VALUES (4, 2, '商品D', '2024-03-01');
INSERT INTO orders VALUES (5, 3, '商品A', '2024-02-28');