用于事件分析的 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 测试的窗口语法。