Kusto查询如何获取SigninLogs中各唯一值对应的最新行
解决方案
你可以用Kusto内置的arg_max()聚合函数实现需求,该函数可以返回指定分组内时间戳最新的对应行数据,同时避免全量查询返回过多结果,也能解决时间戳字段导致distinct无法生效的问题。
调整后的查询语句
假设你要按UserPrincipalName(用户主体名称,用户唯一标识)作为「唯一值」的分组维度,查询语句如下:
SigninLogs | project TimeGenerated, Identity, UserPrincipalName, Location, DeviceDetail | summarize arg_max(TimeGenerated, *) by UserPrincipalName
说明
arg_max(TimeGenerated, *)的作用是取分组内TimeGenerated(时间戳)最大的那条记录,*代表返回该记录所有你已投影的字段by后面跟着的是你要去重的唯一维度字段:- 如果是按单个字段去重,直接填写单个字段即可,比如上面示例的
UserPrincipalName - 如果是按多个字段的组合判断唯一值,把所有字段都放在
by后面即可,比如要按「用户+登录位置」组合去重,就写成by UserPrincipalName, Location
- 如果是按单个字段去重,直接填写单个字段即可,比如上面示例的
性能优化建议
可以在查询最前面增加时间范围过滤,进一步减少扫描的数据量,提升查询效率,比如限定查询最近30天的日志:
SigninLogs | where TimeGenerated >= ago(30d) // 可按需调整时间范围 | project TimeGenerated, Identity, UserPrincipalName, Location, DeviceDetail | summarize arg_max(TimeGenerated, *) by UserPrincipalName
内容的提问来源于stack exchange,提问作者ATur
相关产品推荐
相关产品推荐

