用於事件分析的 SQL 視窗函式
視窗函式跨相關行進行計算,同時保留結果中的每一行。常規 GROUP BY 將許多事件減少到每組一行;視窗可以保留每天、請求或帳戶,同時新增以前的值、排名或滾動基線。
比較相鄰的桶
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 計算滾動七桶基線。第一行的貢獻儲存桶少於七個,因此在需要完整視窗時標記或抑制它們。
按比較單位劃分
當每個業務需要獨立的序列時,新增PARTITION BY service。如果沒有它,前一行可能屬於另一個服務。排序列也應該是確定性的;如果兩個事件共享時間戳,請新增一個穩定識別符號作為決勝局。
ROW_NUMBER 對於為每個邏輯鍵選擇一個事件非常有用:
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 測試的視窗語法。