You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Azure Data Explorer的KQL合并满足时间条件的连续事件窗口?

在Azure Data Explorer中合并关联时间窗口事件

原始数据

行事件StartTimeEndTime
1A01
2B0.92
3C1015
4A1617
5C1718

需求规则

当前行的StartTime ≤ 前一行EndTime + 1.5时,视为同一窗口,合并后输出窗口的起始时间、结束时间及包含的所有事件:

  • B的StartTime(0.9) ≤ 1+1.5,因此行1、2合并为一个窗口
  • 第一个C的StartTime(10) > 2+1.5,视为新窗口,行3、4、5合并为一个窗口

预期输出

行StartTimeEndTime事件列表
102[A, B]
21018[C, A, C]

(注:原预期输出事件列表遗漏了行5的C,此处按实际数据修正)

KQL实现代码

// 替换为你的实际表名
EventTable
| sort by StartTime asc
// 标记新窗口起始行:当前行StartTime超过前一行EndTime+1.5则为新窗口
| extend is_new_window = iif(StartTime > prev(EndTime) + 1.5, 1, 0)
// 第一行默认是新窗口起始
| extend is_new_window = case(row_number() == 1, 1, is_new_window)
// 为每个窗口分配唯一ID
| scan with (step s: true => window_id = row_number();) by (is_new_window == 1)
// 按窗口ID聚合计算
| summarize 
    StartTime = min(StartTime),
    EndTime = max(EndTime),
    事件列表 = make_list(事件)
    by window_id
// 整理输出格式
| order by StartTime asc
| extend 行 = row_number()
| project 行, StartTime, EndTime, 事件列表

代码步骤说明

  1. 排序:先按StartTime升序排列,保证时间顺序正确
  2. 标记新窗口:用prev()获取前一行的EndTime,判断当前行是否属于新窗口;第一行强制标记为新窗口起始
  3. 分配窗口ID:通过scan运算符,每当遇到新窗口标记时生成新ID,将同一窗口的行归为同一ID
  4. 聚合窗口:按窗口ID分组,取窗口内最小StartTime、最大EndTime,用make_list()收集所有事件
  5. 格式整理:重新生成行号,调整列顺序匹配预期输出

内容的提问来源于stack exchange,提问作者nrofis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:27:26