重要 ⏱ 8分★★★★☆

ウィンドウ関数

OVER・RANK・LAG/LEAD・累計・移動平均を完全習得

集計しながら元の行を保持する関数。GROUP BY は行をまとめて減らすが、ウィンドウ関数は各行に集計値を付加するだけで行数は変わらない。

GROUP BY vs ウィンドウ関数
GROUP BY + 集計関数ウィンドウ関数(OVER)
行数グループ数に減少元の行数を保持
元の行の値参照不可参照可能
用途集計値だけほしい集計値+明細を同時にほしい
関数名() OVER (
  [PARTITION BY パーティション列]   -- GROUP BY に相当(省略可)
  [ORDER BY     ソート列]           -- フレーム範囲の基準
  [ROWS|RANGE BETWEEN ... AND ...]  -- フレーム指定(省略可)
)
関数同値の扱い例(100,100,90)
ROW_NUMBER()一意連番(順位は任意)1, 2, 3
RANK()同値は同順位、次を飛ばす1, 1, 3
DENSE_RANK()同値は同順位、次は飛ばさない1, 1, 2
NTILE(n)n 等分してグループ番号付与
-- 部署ごとに給与ランキング
SELECT
  氏名, 部署ID, 給与,
  RANK() OVER (PARTITION BY 部署ID ORDER BY 給与 DESC) AS 部署内順位
FROM 社員;
-- 月次売上の累計
SELECT
  月,
  売上,
  SUM(売上) OVER (ORDER BYROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
    AS 累計売上
FROM 月次売上;
-- 3ヶ月移動平均
SELECT
  月,
  AVG(売上) OVER (ORDER BYROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
    AS 移動平均
FROM 月次売上;
UNBOUNDED PRECEDING = 先頭行から。CURRENT ROW = 現在行。FOLLOWING = 現在行より後。
-- 前月比を計算
SELECT
  月,
  売上,
  LAG(売上, 1) OVER (ORDER BY 月) AS 前月売上,
  売上 - LAG(売上, 1) OVER (ORDER BY 月) AS 差分
FROM 月次売上;
関数動作
LAG(列, n)n行前の値を返す(前の行を参照)
LEAD(列, n)n行後の値を返す(後の行を参照)
FIRST_VALUE(列)フレーム内の最初の値
LAST_VALUE(列)フレーム内の最後の値

📝 理解度チェック

売上が 100, 100, 90 のとき DENSE_RANK() の結果はどれか?
ウィンドウ関数と GROUP BY の最大の違いはどれか?
LAG(売上, 1) OVER (ORDER BY 月) が返す値はどれか?

読了ボタンを押すとトップページの進捗に反映されます