KQL查询使用distinct后返回结果始终固定的问题求助
问题分析与解决方案
你的查询核心问题出在连续两次对User表执行inner join,这会导致不必要的笛卡尔积,进而引发数据重复,最终让distinct的结果不符合预期。
具体问题拆解:
- 你先通过
Major字段关联User表,得到一批匹配记录;接着又通过Minor字段再次关联User表。这相当于把第一次join后的每条记录,再和所有Minor匹配的User记录做一次组合,会产生大量冗余的重复关联结果。 - 不用distinct时,这些重复结果加上原始表中同一用户的不同日期记录,会显示很多条目;而用distinct后,只是把这些重复的用户记录去重,但因为join逻辑错误,得到的46条其实是错误关联后的唯一用户组合,并非真实的目标范围内用户数。
修正后的查询:
应该将两次join合并为一次,用Major和Minor同时作为关联条件,这样才能正确匹配到对应的用户:
TableName | where Date <> '' | where Date >= todatetime('2022-11-07 00:00:00') | where Date <= todatetime('2022-11-08 17:38:00') | where acos(sin(25.27323946648474) * sin(Latitude) + cos(25.27323946648474) * cos(Latitude) * cos(Longitude - 51.499766541858236)) * 6371 <= 50 | where StayType == 'I' // 合并为一次join,同时用Major和Minor关联User表 | join kind=inner User on $left.Major == $right.Major and $left.Minor == $right.Minor | project DocumentNumber, DocumentTypeString, tostring(DocumentExpiryDate), HCNO, NameEnglish, NameArabic, Gender, NationalityName, Vaccinated, PhoneType // 如果需要去重同一用户的多条记录,保留distinct即可 | distinct DocumentNumber, DocumentTypeString, NameEnglish, NameArabic, Gender, NationalityName, Vaccinated, PhoneType, HCNO | order by DocumentTypeString asc
额外说明:
- 如果你的User表中,
Major和Minor组合是唯一标识用户的键,那么一次join就能准确匹配到对应用户,不会产生冗余。 - distinct的作用是去除指定列组合完全重复的记录,如果你想获取范围内的唯一用户,这个操作是合理的,但前提是关联逻辑正确,否则去重后的结果也会失真。
内容的提问来源于stack exchange,提问作者Muhammad Usama Alam
相关产品推荐
相关产品推荐

