SQL
SQLのウィンドウ関数を使いこなす
ROW_NUMBER、RANK、LAGなど、SQLのウィンドウ関数の基本から実践的な使い方までを解説します。
ウィンドウ関数とは
ウィンドウ関数は、集計関数とは異なり、行を集約せずに計算結果を各行に付与できる強力な機能です。
基本構文
関数名() OVER (
[PARTITION BY カラム]
[ORDER BY カラム]
[ROWS/RANGE フレーム指定]
)
ROW_NUMBER:行番号の付与
SELECT
name,
department,
salary,
ROW_NUMBER() OVER (
PARTITION BY department
ORDER BY salary DESC
) AS rank_in_dept
FROM employees;
部門ごとに給与の高い順で番号が振られます。
RANK と DENSE_RANK の違い
| 関数 | 同順位時の扱い | 次の順位 |
|---|---|---|
| ROW_NUMBER | 一意の番号 | 連番 |
| RANK | 同じ番号 | 飛ばす |
| DENSE_RANK | 同じ番号 | 飛ばさない |
SELECT
name,
score,
RANK() OVER (ORDER BY score DESC) AS rank_val,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank_val
FROM students;
LAG / LEAD:前後の行を参照
SELECT
date,
sales,
LAG(sales, 1) OVER (ORDER BY date) AS prev_day_sales,
sales - LAG(sales, 1) OVER (ORDER BY date) AS daily_change
FROM daily_sales;
LAGは前の行、LEADは次の行の値を取得できます。時系列データの分析に非常に便利です。
移動平均の計算
SELECT
date,
sales,
AVG(sales) OVER (
ORDER BY date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS moving_avg_7days
FROM daily_sales;
まとめ
- ウィンドウ関数を使うと、集約せずに分析計算が可能
PARTITION BYでグループ化、ORDER BYで並び順を指定LAG/LEADは時系列データの比較に有用- 移動平均などのフレーム指定で柔軟な集計が可能