0Pricing
SQL Academy · レッスン

フレームウィンドウでのLag/Lead

LAG/LEADとフレームウィンドウを組み合わせ、期間ごとの差分を計算して時系列の欠損を検出します。

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

LAG/LEADのまとめ

LAG(col, n)は、ウィンドウ内で現在の行からn行前の値を返します。LEAD(col, n)は、先の行を参照します。

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

デフォルト値付きLAG

第3引数には、隣接する行が存在しない場合のデフォルト値を指定します。

LAG(revenue, 1, 0) OVER (ORDER BY day)
-- Returns 0 instead of NULL for the very first row.

差分を計算する

前日比の変化量です。

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

複数ステップのLAG

N日前と比較します。前週比や前年同月比などに便利です。

LAG(revenue, 7) OVER (ORDER BY day)   -- 7 days ago
LAG(revenue, 365) OVER (ORDER BY day) -- 1 year ago

予測スロットにLEADを使う

「次のイベントは何か?」というパターンに使います。

SELECT id, ts,
       LEAD(ts) OVER (PARTITION BY user_id ORDER BY ts) AS next_ts,
       LEAD(ts) OVER (PARTITION BY user_id ORDER BY ts) - ts AS gap_to_next
FROM events;

ユーザーごとのパターン

LAG/LEADはPARTITION BYを考慮します。

SELECT user_id, ts, action,
       LAG(action) OVER (PARTITION BY user_id ORDER BY ts) AS prev_action
FROM events;
-- prev_action is the user's previous event, not globally.

状態の変化を検出する

LAGとCASEを組み合わせます。

SELECT id, status,
  CASE WHEN status <> LAG(status) OVER (ORDER BY ts) THEN 'changed' ELSE 'same' END
FROM orders;

FIRST_VALUE / LAST_VALUE

フレーム内の最初または最後の値を取得します。

FIRST_VALUE(status) OVER (PARTITION BY order_id ORDER BY ts) AS first_status
-- The status when the order was first seen.

LAST_VALUE(status) OVER (
  PARTITION BY order_id ORDER BY ts
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS final_status

NTH_VALUE

順序付けされたウィンドウのN番目の値を取得します。

NTH_VALUE(revenue, 3) OVER (
  ORDER BY revenue DESC
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)
-- Third-highest revenue value.

グループごとのフレーム関数

LAGとPARTITION BYを組み合わせて、グループごとの隣接行を取得します。

SELECT user_id, ts, page,
       LAG(page) OVER (PARTITION BY user_id ORDER BY ts) AS prev_page,
       LEAD(page) OVER (PARTITION BY user_id ORDER BY ts) AS next_page
FROM page_views;

パフォーマンス

ウィンドウ関数はパーティションごとに一度ソートします。パーティションが大きい場合は、PARTITION BYとORDER BYの列にインデックスを作成してください。

まとめ

LAG/LEADを使うと、行同士の比較を低コストで行えます。

  • デフォルト値でNULLを回避できる
  • CASEと組み合わせて状態の変化を検出できる
  • FIRST_VALUE/LAST_VALUE/NTH_VALUEで関数群を補完できる

クイックチェック

各行に、ユーザーの次のイベントまでの間隔(秒)を含めたいとします。どの関数を使いますか?

よくある質問

「フレームウィンドウでの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は初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「フレームウィンドウでのLag/Lead」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. フレーム句:ROWSとRANGE
  2. フレームウィンドウでのLag/Lead
  3. NTILEとCume_Distによるバケット分割
  4. 実務で使うレポートパターン
← SQL Academyに戻る