LAG / LEAD
| 対応: | SQL:2011(2011) |
|---|
ウィンドウ関数の1つで、現在の行から前後のN行の値を参照できる関数です。売上の前日比・前月比の計算など、時系列データの比較によく使われます。
構文
LAG: N行前の値を参照します。
LAG(col [, N [, default]]) OVER ([PARTITION BY group_col] ORDER BY sort_col)
LEAD: N行後の値を参照します。
LEAD(col [, N [, default]]) OVER ([PARTITION BY group_col] ORDER BY sort_col)
構文一覧
| 関数 | 概要 |
|---|---|
| LAG(列, N, デフォルト) | 現在行のN行前の値を返します。Nを省略すると1行前になります。参照先がない場合はデフォルト値(省略時はNULL)を返します。 |
| LEAD(列, N, デフォルト) | 現在行のN行後の値を返します。Nを省略すると1行後になります。参照先がない場合はデフォルト値(省略時はNULL)を返します。 |
サンプルコード
以下の『daily_sales』テーブルを例に説明します。
前日の売上と差額を計算します。
sample_lag_lead.sql
SELECT
sale_date,
amount,
LAG(amount, 1, 0) OVER (ORDER BY sale_date) AS prev_amount,
amount - LAG(amount, 1, 0) OVER (ORDER BY sale_date) AS diff
FROM daily_sales
ORDER BY sale_date;
+------------+--------+-------------+--------+ | sale_date | amount | prev_amount | diff | +------------+--------+-------------+--------+ | 2024-01-01 | 120000 | 0 | 120000 | | 2024-01-02 | 98000 | 120000 | -22000 | | 2024-01-03 | 145000 | 98000 | 47000 | | 2024-01-04 | 88000 | 145000 | -57000 | +------------+--------+-------------+--------+ 4 rows in set
翌日の売上も並べて前後の売上を比較します。
sample_lag_lead.sql
SELECT
sale_date,
amount,
LAG(amount) OVER (ORDER BY sale_date) AS prev_amount,
LEAD(amount) OVER (ORDER BY sale_date) AS next_amount
FROM daily_sales
ORDER BY sale_date;
+------------+--------+-------------+-------------+ | sale_date | amount | prev_amount | next_amount | +------------+--------+-------------+-------------+ | 2024-01-01 | 120000 | NULL | 98000 | | 2024-01-02 | 98000 | 120000 | 145000 | | 2024-01-03 | 145000 | 98000 | 88000 | | 2024-01-04 | 88000 | 145000 | NULL | +------------+--------+-------------+-------------+ 4 rows in set
データベース別の書き方
『LAG()』『LEAD()』は MySQL(8.0以降)・PostgreSQL・Oracle・SQLite(3.25以降)で共通して使用できます。
SELECT
sale_date,
amount,
LAG(amount, 1, 0) OVER (ORDER BY sale_date) AS prev_amount,
amount - LAG(amount, 1, 0) OVER (ORDER BY sale_date) AS diff
FROM daily_sales
ORDER BY sale_date;
概要
『LAG』と『LEAD』はN行前後の値を返すウィンドウ関数です。第2引数でオフセット(省略時は1)、第3引数で参照先が存在しない場合のデフォルト値を指定できます。デフォルト値を省略すると NULL が返ります。
前日比・前月比の計算は自己結合(SELF JOIN)でも実現できますが、LAG/LEAD の方がコードが簡潔です。PARTITION BY を付けるとグループごとに独立した前後参照になるため、複数の系列を1つのテーブルに持つ場合は必ず指定してください。指定しないとグループをまたいで参照されます。
ウィンドウ関数の基本構文は『OVER / PARTITION BY』を、累計・移動平均は『SUM / AVG(ウィンドウ)』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。