如何用Azure Data Explorer的KQL合并满足时间条件的连续事件窗口?
在Azure Data Explorer中合并关联时间窗口事件
原始数据
| 行 | 事件 | StartTime | EndTime |
|---|---|---|---|
| 1 | A | 0 | 1 |
| 2 | B | 0.9 | 2 |
| 3 | C | 10 | 15 |
| 4 | A | 16 | 17 |
| 5 | C | 17 | 18 |
需求规则
当前行的StartTime ≤ 前一行EndTime + 1.5时,视为同一窗口,合并后输出窗口的起始时间、结束时间及包含的所有事件:
- B的StartTime(0.9) ≤ 1+1.5,因此行1、2合并为一个窗口
- 第一个C的StartTime(10) > 2+1.5,视为新窗口,行3、4、5合并为一个窗口
预期输出
| 行 | StartTime | EndTime | 事件列表 |
|---|---|---|---|
| 1 | 0 | 2 | [A, B] |
| 2 | 10 | 18 | [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, 事件列表
代码步骤说明
- 排序:先按
StartTime升序排列,保证时间顺序正确 - 标记新窗口:用
prev()获取前一行的EndTime,判断当前行是否属于新窗口;第一行强制标记为新窗口起始 - 分配窗口ID:通过
scan运算符,每当遇到新窗口标记时生成新ID,将同一窗口的行归为同一ID - 聚合窗口:按窗口ID分组,取窗口内最小
StartTime、最大EndTime,用make_list()收集所有事件 - 格式整理:重新生成行号,调整列顺序匹配预期输出
内容的提问来源于stack exchange,提问作者nrofis
相关产品推荐
相关产品推荐

