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

PARTITION BY

PARTITION BYでウィンドウをグループに分割する応用パターンを学びます。

PARTITION BYの役割

PARTITION BYはウィンドウ関数のOVER句内で使い、 計算対象の行をグループに分割します。 GROUP BYはグループを1行に集約しますが、PARTITION BYは行を集約せずにグループごとに計算します。 各グループ内で独立した順位付けや累積計算が可能です。

  • PARTITION BYを省略すると全行が1つのウィンドウになる
  • 複数カラムで分割可能: PARTITION BY dept, year
  • PARTITION BYとORDER BYを組み合わせてグループ内ランキングを実現

例1: 部門別の順位付けと全体順位の比較

テーブル定義
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);
SQLエディタ

例2: 部門別累積合計と部門内シェア

テーブル定義
CREATE TABLE sales_data (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  department TEXT NOT NULL,
  sales INTEGER NOT NULL
);
INSERT INTO sales_data VALUES (1, '田中太郎', '東日本', 500000);
INSERT INTO sales_data VALUES (2, '鈴木花子', '東日本', 300000);
INSERT INTO sales_data VALUES (3, '佐藤一郎', '東日本', 200000);
INSERT INTO sales_data VALUES (4, '山田二郎', '西日本', 450000);
INSERT INTO sales_data VALUES (5, '伊藤花代', '西日本', 380000);
SQLエディタ

例3: 複数カラムによるパーティション

テーブル定義
CREATE TABLE quarterly_revenue (
  id INTEGER PRIMARY KEY,
  year INTEGER NOT NULL,
  quarter INTEGER NOT NULL,
  region TEXT NOT NULL,
  revenue INTEGER NOT NULL
);
INSERT INTO quarterly_revenue VALUES (1, 2024, 1, '東京', 200000);
INSERT INTO quarterly_revenue VALUES (2, 2024, 2, '東京', 250000);
INSERT INTO quarterly_revenue VALUES (3, 2024, 1, '大阪', 180000);
INSERT INTO quarterly_revenue VALUES (4, 2024, 2, '大阪', 220000);
SQLエディタ