跳转到内容
Telemetry
浏览文档
概念与 SQL 模式更新于 2026年7月28日由 Telemetry 编辑团队和产品团队审核阅读约需 2 分钟

让编程智能体使用这篇文档

打开 Claude Code、Codex、Cursor 或其他编码代理的集中提示包,然后将其适应此处介绍的工作流程。

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

相关产品功能

对结构化事件表运行只读 DataFusion SQL 并重用结果。

内容责任与技术参考

Telemetry 编辑团队负责维护本文;产品团队审核功能行为、示例和适用范围。

查看编辑规范