LAG、LEADと時系列パターン
LAGとLEADで各行を前後の行と比較し、期間ごとの差分を作成します。
「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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- OVER、PARTITION BY、ORDER BY
- ROW_NUMBER、RANK、DENSE_RANK
- LAG、LEADと時系列パターン
- 累積合計と移動平均