コマンド道場

$ man lag

LAG / LEAD

ウィンドウ関数

並べた中で、1 つ前(LAG)や 1 つ後ろ(LEAD)の行の値を持ってくる。前月比などに使う。

呼び出しの形

LAG(式) OVER (ORDER BY 式)
LAG(式, n, 既定値) OVER (ORDER BY 式)
LEAD(式) OVER (ORDER BY 式)

つまずきやすいところ

  • 最初の行(LEAD なら最後の行)は必ず NULLです。引き算に使うなら第 3 引数か COALESCE で埋めてください。

  • ORDER BY が「前」「後ろ」の意味を決めます。並び順を書かないと結果に意味がありません

  • PARTITION BY を書き忘れると、区切りをまたいで前の行を拾ってしまいます(顧客 A の最初の行が、顧客 B の最後の行を「前」として拾う)。

実行例

結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。

受注日ごとの件数と、その前の日の件数を並べる
SELECT juchu_on, COUNT(*) AS kensu, LAG(COUNT(*)) OVER (ORDER BY juchu_on) AS zenkai FROM juchu GROUP BY juchu_on ORDER BY juchu_on
juchu_onkensuzenkai
2025-11-051NULL
2025-11-1811
2025-12-0211
2025-12-0911
2025-12-2411
2026-01-0711
2026-01-2111
2026-02-0311

10(うち 8 行を表示)

いちばん上の行には前がないので NULL になります。

第 3 引数で「前が無いときは 0」にして差を求める
SELECT juchu_on, COUNT(*) AS kensu, COUNT(*) - LAG(COUNT(*), 1, 0) OVER (ORDER BY juchu_on) AS sa FROM juchu GROUP BY juchu_on ORDER BY juchu_on
juchu_onkensusa
2025-11-0511
2025-11-1810
2025-12-0210
2025-12-0910
2025-12-2410
2026-01-0710
2026-01-2110
2026-02-0310

10(うち 8 行を表示)

説明

LAG前の行LEAD後ろの行の値を、いまの行に並べて取り出します。「前の月からいくら増えたか」のような行どうしの比較を、自己結合なしで書けます。

引数は 3 つまで取れます。

  • 第 1 引数 … 持ってきたい式
  • 第 2 引数 … いくつ前か(既定 1)
  • 第 3 引数 … 前の行が無いときに返す値(既定 NULL)

⚠️ 最初の行には前の行がありません。既定では NULL が入るので、そのまま引き算すると結果も NULL になります。0 を入れたいなら第 3 引数を書いてください。

PARTITION BY を付けると、区切りをまたいで持ってくることはありません。「顧客ごとの前回の受注日」のような使い方ができます。

ほかの製品でも通るか

未確認の製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server

未確認: Oracle Database / IBM Db2

製品ごとの対応表(根拠つき)を見る

次に読む

関係する関数

根拠にした一次情報