在Kusto中使用Join结合contains运算符时如何匹配单个值并去重
解决方法
要避免关联后出现重复行,核心是先对表B做预处理,确保每个ID只保留第一个包含"blah"的Text行,再和表A做关联。
方案1:保留首个匹配的Text
修改你的查询,先对B表按ID分组,只取每个ID下第一个符合条件的记录:
let B = datatable (ID:long, Text:string) [ 1, "blah blah blah", 1, "123 123 123", 1, "123 blah 123", 2, "blah blah blah", 2, "234 234 123", 2, "123 blah 234"]; let A = datatable (ID:long, Name:string) [ 1, "abc", 2, "cde", 3, "def", 4, "efg", 5, "ghi", 6, "ijk"]; // 预处理B:每个ID只保留第一个包含"blah"的行 let filtered_B = B | where Text contains "blah" | partition by ID (take 1); // 按ID分组后取第一行 A | join kind=leftouter filtered_B on ID | project ID, Name, Text
这个查询会输出你期望的结果:每个ID最多一行,仅保留B中首个匹配的Text,无重复。
方案2:仅验证存在性(更高效)
如果你的需求只是确认B中是否存在该ID的"blah",不需要具体的Text内容,可以用聚合查询直接返回布尔标记,性能更优:
let B = datatable (ID:long, Text:string) [ 1, "blah blah blah", 1, "123 123 123", 1, "123 blah 123", 2, "blah blah blah", 2, "234 234 123", 2, "123 blah 234"]; let A = datatable (ID:long, Name:string) [ 1, "abc", 2, "cde", 3, "def", 4, "efg", 5, "ghi", 6, "ijk"]; let B_has_blah = B | summarize has_blah = countif(Text contains "blah") > 0 by ID; A | join kind=leftouter B_has_blah on ID | project ID, Name, has_blah
输出结果会显示每个ID是否存在"blah",没有重复行,且查询开销更低。
内容的提问来源于stack exchange,提问作者Sahil Raj
相关产品推荐
相关产品推荐

