SQL イベント分析用のウィンドウ関数
ウィンドウ関数は、結果の各行を保持しながら、関連する行全体を計算します。定期的な GROUP BY 多くのイベントをグループごとに 1 行に減らします。ウィンドウでは、以前の値、ランク、またはローリング ベースラインを追加しながら、毎日、リクエスト、またはアカウントを保持できます。
隣接するバケットを比較する
WITH daily AS (
SELECT
date_trunc('day', timestamp_utc) AS day,
COUNT(*) AS completed_jobs
FROM job_events
WHERE status = 'completed'
AND timestamp_utc >= now() - INTERVAL '30 days'
GROUP BY date_trunc('day', timestamp_utc)
)
SELECT
day,
completed_jobs,
LAG(completed_jobs) OVER (ORDER BY day) AS previous_day_jobs,
AVG(completed_jobs) OVER (
ORDER BY day
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS rolling_7_bucket_average
FROM daily
ORDER BY day;
LAG ウィンドウの順序に従って前の行を読み取ります。額装された AVG ローリング 7 バケット ベースラインを計算します。最初の行には寄与するバケットが 7 つ未満であるため、完全なウィンドウが必要な場合は、それらのバケットにラベルを付けるか非表示にします。
比較単位で区切る
追加 PARTITION BY service 各サービスが独立したシーケンスを必要とする場合。これがないと、前の行が別のサービスに属している可能性があります。列の順序付けも決定的である必要があります。 2 つのイベントがタイムスタンプを共有する場合は、安定した識別子をタイブレーカーとして追加します。
ROW_NUMBER 論理キーごとに 1 つのイベントを選択する場合に便利です。
ROW_NUMBER() OVER (
PARTITION BY delivery_id
ORDER BY timestamp_utc DESC, event_id DESC
) AS newest_rank
フィルターして newest_rank = 1 外部クエリ内。パターンを使用する前に、「最新」または「最初に受け入れられた」のどちらが正しいビジネス ルールであるかを判断してください。
Windows では、欠落しているタイム バケット、重複したソース イベント、またはあいまいな行粒度は修復されません。前期比の変化を解釈する前に、これらの条件を検証してください。読む SQL 重複排除 アイデンティティ ルールと DataFusion SQL リファレンス Telemetry によってテストされたウィンドウ構文用。