如何编写Kusto查询按时间聚合并动态合并多行列数据?
Kusto动态转置查询方案
针对你需要按Time聚合,动态将不同id的p90/p95/p99指标转为列的需求,推荐两种简洁的实现方式:
方法一:使用pivot运算符(推荐)
pivot是Kusto专门用于行转列的运算符,支持动态生成列,无需硬编码id值:
let raw = datatable(id:string, Time:string, p90:long, p95:long, p99:long) [ "A", "2025-01-06", 38, 124, 156, "B", "2025-01-06", 66, 120, 130, "A", "2025-01-13", 55, 99, 150, "B", "2025-01-13", 77, 100, 130, ]; raw | pivot id, take_any(p90), take_any(p95), take_any(p99)
说明:
pivot id:指定以id列作为行转列的依据take_any(p90):因为每个Time+id组合仅有一行数据,用take_any直接取对应指标值即可(也可替换为any)- 当新增
id(如C、D)时,查询会自动生成C_p90/C_p95/C_p99等列,无需修改代码
方法二:使用字典打包+展开
通过将指标打包为动态字典,聚合后再展开为列,同样支持动态id:
let raw = datatable(id:string, Time:string, p90:long, p95:long, p99:long) [ "A", "2025-01-06", 38, 124, 156, "B", "2025-01-06", 66, 120, 130, "A", "2025-01-13", 55, 99, 150, "B", "2025-01-13", 77, 100, 130, ]; raw | extend metrics = pack(strcat(id, "_p90"), p90, strcat(id, "_p95"), p95, strcat(id, "_p99"), p99) | summarize metrics = bag_merge(make_bag(metrics)) by Time | evaluate bag_unpack(metrics) | project Time, *
说明:
extend metrics = pack(...):为每行生成字典,键为{id}_p90格式,值为对应指标summarize ... by Time:按Time聚合,合并同一时间点的所有指标字典evaluate bag_unpack(metrics):将字典的键值对展开为独立列project Time, *:将Time列置于最前面
两种方法都能输出你需要的格式,且适配动态变化的id值。
内容的提问来源于stack exchange,提问作者Qingsheng he
相关产品推荐
相关产品推荐

