如何在KQL中实现交叉乘积连接并展示全组合计数(含零值)
KQL实现所有Value A/Value B组合的计数(含0值)
解决这个问题的核心是先生成所有可能的Value A和Value B组合,再和原表的实际统计结果做左连接,最后把不存在组合的计数替换为0。具体步骤和代码如下:
实现步骤
- 提取Value A和Value B的所有唯一取值
- 交叉连接两个取值集合,生成全部可能的组合
- 统计原表中每个(A,B)组合的实际出现次数
- 左连接全组合表与统计结果,用
coalesce()将空值计数转为0
示例代码
假设你的表名为YourTable,字段为ValueA和ValueB:
// 获取ValueA的所有唯一值 let distinct_A = YourTable | distinct ValueA; // 获取ValueB的所有唯一值 let distinct_B = YourTable | distinct ValueB; // 生成所有可能的A+B组合 let all_combinations = distinct_A | join kind=cross (distinct_B); // 统计原表中各组合的实际计数 let actual_counts = YourTable | summarize Count = count() by ValueA, ValueB; // 左连接并填充0值 all_combinations | join kind=leftouter (actual_counts) on ValueA, ValueB | project ValueA, ValueB, Count = coalesce(Count, 0) | sort by ValueA, ValueB
代码说明
kind=cross:实现两个集合的交叉乘积,确保生成所有A和B的组合,不受原表数据存在性影响leftouter连接:保留全组合的每一行,不存在的组合会在Count字段返回nullcoalesce(Count, 0):将null值替换为0,满足不存在组合计数为0的需求
如果已知Value A和Value B的固定取值(比如都是1-5),可以直接用range生成取值集合,无需从表中提取:
let distinct_A = range ValueA from 1 to 5 step 1; let distinct_B = range ValueB from 1 to 5 step 1; let all_combinations = distinct_A | join kind=cross (distinct_B); let actual_counts = YourTable | summarize Count = count() by ValueA, ValueB; all_combinations | join kind=leftouter (actual_counts) on ValueA, ValueB | project ValueA, ValueB, Count = coalesce(Count, 0) | sort by ValueA, ValueB
内容的提问来源于stack exchange,提问作者Samson
相关产品推荐
相关产品推荐

