フレームウィンドウでの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_statusNTH_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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- フレーム句:ROWSとRANGE
- フレームウィンドウでのLag/Lead
- NTILEとCume_Distによるバケット分割
- 実務で使うレポートパターン