如何在KQL中通过子查询多条件筛选未确认通知的行?
KQL实现:找出事件中未确认通知的人员
完整查询语句
// 解析通知目标,提取每个NotiId对应的所有接收人pid let parsed_noti_targets = NotifStages | extend pid_list = extract_all(@"pid: (\d+)", Targets) | mv-expand pid = pid_list to typeof(string) | project NotiId, pid; // 整理事件与通知的关联及已确认记录 let event_noti_acks = NotifChain | project EventId, NotiId, AckedBy = tostring(AckedBy); // 筛选未确认的事件-接收人组合 let unacked_targets = parsed_noti_targets | join kind=inner event_noti_acks on NotiId | where isempty(AckedBy) or AckedBy != pid | project EventId, pid; // 关联人员表获取姓名并整理结果 unacked_targets | join kind=inner People on $left.pid == $right.pid | project EventId, 未确认人员姓名 = name | distinct EventId, 未确认人员姓名 | sort by EventId
步骤说明
- 解析通知目标:使用
extract_all正则匹配Targets字段中的所有pid,通过mv-expand将每个pid拆分为单独行,得到每个通知对应的所有接收人。 - 整理事件-通知关联:转换
AckedBy为字符串类型,统一格式以便后续对比,保留事件ID、通知ID和已确认的pid。 - 筛选未确认记录:将通知接收人与事件-通知关联表内连接,筛选出两种未确认场景:一是该事件下的通知无确认记录(
AckedBy为空),二是当前接收人未出现在确认列表中,得到事件ID与未确认pid的对应关系。 - 关联人员信息:连接
People表获取未确认人员的姓名,去重后按事件ID排序输出最终结果。
示例数据执行结果
| EventId | 未确认人员姓名 |
|---|---|
| 345 | Spudz |
| 777 | Spudz |
| 777 | Chuckles |
| 298 | Chuckles |
内容的提问来源于stack exchange,提问作者not_a_generic_user
相关产品推荐
相关产品推荐

