使用Kusto Union算子保留所有聚合字段的技术求助
解决KQL中合并多聚合查询字段丢失/报错的问题
方案1:单次SUMMARIZE计算所有聚合(推荐)
无需拆分查询再合并,直接在一次summarize中同时计算所有需要的聚合值,既能保留所有字段,又能提升查询效率:
Values | where ts between(datetime(2024-01-01T08:30:32.406Z) .. datetime(2024-09-30T23:45:32.406Z)) and id in ('123') and key in ('1', '2') | summarize avg_val = avg(val), min_val = min(val) by id, key, bin(ts, 1min) | project id, key, ts, avg_val, min_val | order by id, key, ts
方案2:补全UNION子查询的字段结构(需拆分查询时使用)
如果必须拆分查询再合并,需确保每个子查询的字段结构完全一致,缺失字段用dynamic(null)填充:
// 计算平均值,补全min_val字段为null Values | where ts between(datetime(2024-01-01T08:30:32.406Z) .. datetime(2024-09-30T23:45:32.406Z)) and id in ('123') and key in ('1', '2') | summarize avg_val = avg(val) by id, key, bin(ts, 1min) | project id, key, ts, avg_val, min_val = dynamic(null) | union ( // 计算最小值,补全avg_val字段为null Values | where ts between(datetime(2024-01-01T08:30:32.406Z) .. datetime(2024-09-30T23:45:32.406Z)) and id in ('123') and key in ('1', '2') | summarize min_val = min(val) by id, key, bin(ts, 1min) | project id, key, ts, avg_val = dynamic(null), min_val ) | order by id, key, ts
你之前遇到的问题分析
- 第一种尝试字段丢失:第一个查询末尾的分号
;将其标记为独立查询,后续union仅处理第二个查询,因此结果中看不到avg_val。去掉分号后虽能合并,但字段结构不一致会导致缺失字段显示为null,不如上述方案直观。 - 第二种尝试报错:
'union' operator: Failed to resolve table expression named 'avg_data':多为let语句语法问题,需确保每个let语句末尾分号正确,且最后一行是执行合并的语句。'project' operator: Failed to resolve scalar expression named 'avg_val':summarize中未给聚合结果命名为avg_val,需改为summarize avg_val = avg(val)才能在project中引用。
内容的提问来源于stack exchange,提问作者Andresch Serj
相关产品推荐
相关产品推荐

