OVER・RANK・LAG/LEAD・累計・移動平均を完全習得
集計しながら元の行を保持する関数。GROUP BY は行をまとめて減らすが、ウィンドウ関数は各行に集計値を付加するだけで行数は変わらない。
| 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 BY 月 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS 累計売上 FROM 月次売上;
-- 3ヶ月移動平均 SELECT 月, AVG(売上) OVER (ORDER BY 月 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS 移動平均 FROM 月次売上;
-- 前月比を計算 SELECT 月, 売上, LAG(売上, 1) OVER (ORDER BY 月) AS 前月売上, 売上 - LAG(売上, 1) OVER (ORDER BY 月) AS 差分 FROM 月次売上;
| 関数 | 動作 |
|---|---|
| LAG(列, n) | n行前の値を返す(前の行を参照) |
| LEAD(列, n) | n行後の値を返す(後の行を参照) |
| FIRST_VALUE(列) | フレーム内の最初の値 |
| LAST_VALUE(列) | フレーム内の最後の値 |
読了ボタンを押すとトップページの進捗に反映されます