SQL Academy · レッスン

LAG、LEADと時系列パターン

LAGとLEADで各行を前後の行と比較し、期間ごとの差分を作成します。

レッスン 3/413 ステップ

「LAG、LEADと時系列パターン」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

LAGとLEAD:前後の行を参照する

これらはウィンドウ内の隣接する行にアクセスします。

  • LAG(col, n, default) — 現在の行よりn行前の値
  • LEAD(col, n, default) — 現在の行よりn行後の値

前の行

同じユーザーの各注文を、1つ前の注文と比較します。

SELECT id, user_id, created_at, total,
       LAG(total) OVER (
         PARTITION BY user_id ORDER BY created_at
       ) AS prev_total
FROM orders;

前日との差分

前日との差分を求めます。

SELECT day, revenue,
       revenue - LAG(revenue) OVER (ORDER BY day) AS delta
FROM daily_revenue
ORDER BY day;

前年同月比

月次系列に対してオフセット12でLAGを使用します。

SELECT month, revenue,
       LAG(revenue, 12) OVER (ORDER BY month) AS prev_year_revenue,
       revenue / NULLIF(LAG(revenue, 12) OVER (ORDER BY month), 0) - 1 AS yoy
FROM monthly_revenue;

欠損の検出

データが欠けている日を見つけます。

WITH d AS (
  SELECT day, LAG(day) OVER (ORDER BY day) AS prev_day FROM daily_signups
)
SELECT day, prev_day, day - prev_day AS gap_days
FROM d
WHERE day - prev_day > 1;

セッション化

間隔がしきい値を超えた箇所で行をセッションに分割します。

WITH gaps AS (
  SELECT user_id, ts,
         CASE WHEN ts - LAG(ts) OVER (PARTITION BY user_id ORDER BY ts)
                 > INTERVAL '30 min'
              THEN 1 ELSE 0 END AS new_session
  FROM events
)
SELECT user_id, ts,
       SUM(new_session) OVER (PARTITION BY user_id ORDER BY ts) AS session_id
FROM gaps;

グループ内の最初と最後

FIRST_VALUEとLAST_VALUEで、ウィンドウの範囲の先頭と末尾を取得します。

SELECT id, total,
       FIRST_VALUE(total) OVER (PARTITION BY user_id ORDER BY created_at) AS first_order,
       LAST_VALUE(total)  OVER (PARTITION BY user_id ORDER BY created_at
         ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_order
FROM orders;
-- LAST_VALUE needs the explicit frame, otherwise default frame ends at current row.

NTH_VALUE

パーティション内のN番目の値を選択します。

SELECT id,
       NTH_VALUE(total, 2) OVER (
         PARTITION BY user_id ORDER BY total DESC
         ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
       ) AS second_largest
FROM orders;

時系列のデフォルト値

LAGの3番目の引数は、前の行が存在しない場合のデフォルト値です。

SELECT day, revenue,
       revenue - LAG(revenue, 1, 0) OVER (ORDER BY day) AS delta
FROM daily_revenue;
-- delta on first day = revenue itself (vs NULL)

自己結合による代替

LAGは自己結合でも記述できますが、遅くて複雑になります。常にウィンドウ関数を優先してください。

パフォーマンス

ウィンドウ関数はパーティションを1回走査します。ボトルネックはソートなので、可能であればORDER BY列にインデックスを作成してください。

まとめ

LAGとLEADによって、行と行を比較できます。

  • パーティション内の前後の行を参照できます
  • 差分、期間ごとの比較、セッション化に使えます
  • FIRST_VALUE/LAST_VALUEで範囲の先頭と末尾を取得できます

理解度チェック

日ごとの売上の変化を計算したい場合、どのウィンドウ関数を使いますか。

無料で開始

AI チューターと学ぶ SQL — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
46
レッスン
183

よくある質問

「LAG、LEADと時系列パターン」レッスンは無料ですか?

はい。「LAG、LEADと時系列パターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「LAG、LEADと時系列パターン」で何を学びますか?

LAGとLEADで各行を前後の行と比較し、期間ごとの差分を作成します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「LAG、LEADと時系列パターン」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. OVER、PARTITION BY、ORDER BY
  2. ROW_NUMBER、RANK、DENSE_RANK
  3. LAG、LEADと時系列パターン
  4. 累積合計と移動平均
← SQL Academyに戻る