在KQL中复用查询结果:计算分组最小平均差值
问题需求
现有KQL查询可计算每个group分组下各class的value平均值,并提取每个分组中平均最小的class:
let average = materialize(FooTable | summarize avg_value = avg(value) by group, class | summarize arg_min(avg_value, class) by group )
该查询输出示例(每个分组下平均最小的class):
| group | class | avg_value |
|---|---|---|
| G1 | C1 | 100 |
| G2 | C2 | 150 |
| .. | .. | .. |
现在需要实现:展示所有group、class、value的相关行,同时计算每行数值与对应分组最小类平均值的差值(delta)。当前有查询框架,需补充获取分组最小类平均值的逻辑:
FooTable | where value > ( 此处需插入获取分组最小类平均值的查询 )
期望输出示例:
| group | class | min_avg_value | delta |
|---|---|---|---|
| G1 | C1 | 100 | 0 |
| G1 | C2 | 120 | 20 |
| G2 | C1 | 200 | 50 |
| G2 | C2 | 150 | 0 |
| .. | .. | .. | .. |
解决方案
可以通过子查询+关联的方式实现,先计算每个分组的最小平均value,再关联回目标数据计算差值:
方案1:输出group+class聚合后的差值结果
// 缓存每个分组的最小平均value let group_min_avg = materialize( FooTable | summarize avg_value = avg(value) by group, class | summarize min_avg_value = min(avg_value) by group ); // 关联数据并计算差值 FooTable | summarize avg_value = avg(value) by group, class | join kind=inner group_min_avg on group | extend delta = avg_value - min_avg_value | project group, class, min_avg_value, delta
方案2:保留原始每行数据并计算差值
如果需要展示原始表的每一行而非聚合结果,可调整为:
let group_min_avg = materialize( FooTable | summarize avg_value = avg(value) by group, class | summarize min_avg_value = min(avg_value) by group ); FooTable | join kind=inner group_min_avg on group | extend delta = value - min_avg_value | project group, class, value, min_avg_value, delta
关键说明
materialize()用于缓存中间计算结果,避免重复执行相同逻辑,提升查询性能- 两次
summarize嵌套:先计算每个group+class的平均值,再提取每个group下的最小平均值 - 通过
join将目标数据与分组最小平均值关联,最后用extend生成delta差值字段
内容的提问来源于stack exchange,提问作者Kevindra
相关产品推荐
相关产品推荐

