Azure Data Explorer查询指定时段未发送心跳用户的语句问题
问题原因及解决方案
你的查询逻辑存在问题:当用左连接筛选出从未发送过心跳的用户时,这些用户的HeartBeatDate字段值为null,后续添加的时间范围条件HeartBeatDate between (...)会直接排除所有null值的记录,导致无结果返回。
要筛选指定时间范围内未发送心跳的用户,正确逻辑如下:
- 先从
Heartbeat表中提取指定时间范围内有心跳记录的用户列表 - 用
Users表左连接这个筛选后的列表,找出未匹配上的用户(即该时间段内无心跳的用户)
修正后的Kusto查询:
// 获取指定时间内有心跳记录的用户 let active_users = Heartbeat | where HeartBeatDate between (datetime('2024-07-14 16:04:10')..datetime('2024-07-15 16:04:10')) | distinct userEmail; // 从用户表中排除有心跳的用户,得到目标结果 Users | join kind=leftouter active_users on userEmail | where isempty(userEmail1) // 筛选未匹配到的用户(该时间段无心跳) | distinct userLoginName, userEmail, userFullName, userPicture, userCreateDate, userPhoneNumber
另外,原查询中userEmail1 !has (userEmail)的写法不够严谨,判断左连接后右表无匹配的标准写法是isempty(userEmail1)(适配字段为空的场景)。
内容的提问来源于stack exchange,提问作者Usama Alam
相关产品推荐
相关产品推荐

