DataStudy Blog
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 は時系列データの比較に有用
  • 移動平均などのフレーム指定で柔軟な集計が可能