如何在Log Analytics KQL中组合distinct与project实现指定列去重
KQL指定列去重同时保留其他字段解决方案
现有写法的问题是distinct运算符仅会返回语句中指定的列,会丢失提前用project声明的TimeGenerated、Start、ErrorMessage等其他需要的字段,无法满足需求。推荐使用summarize配合arg_max/any聚合函数实现需求,具体查询语句如下:
ADFActivityRun | where ActivityType in ("Copy", "ExecuteDataFlow") | where Status in ("Succeeded", "Failed") | extend DataFactory=substring(tostring(split(ResourceId, "/", 8)), 2, strlen(tostring(split(ResourceId, "/", 8)))-4), RowsRead = parse_json(Output).rowsRead, RowsCopied = parse_json(Output).rowsCopied, rowsWritten = parse_json(Output).runStatus.metrics.sink1.rowsWritten // 按需要去重的列分组,取每组最新生成的1条记录的全部字段 | summarize arg_max(TimeGenerated, *) by PipelineName, PipelineRunId, ActivityName, Status, ActivityType, DataFactory // 按需筛选最终返回的字段 | project TimeGenerated, DataFactory, PipelineRunId, PipelineName, ActivityName, Status, ActivityType, Start, End, ErrorMessage, FailureType, RowsRead, RowsCopied, rowsWritten | order by TimeGenerated desc
方案说明
- 优先用
extend做字段计算,不会提前裁剪数据集,避免后续聚合时丢失所需字段 arg_max(TimeGenerated, *)中by后接的就是需要保证唯一的去重列,*表示返回该条记录的所有字段,如果不需要最新记录,仅需随机返回分组内一条记录,可替换为any(*)- 最后用
project筛选要输出的字段,可根据实际需求调整返回内容 - 小优化:将多条件等值判断替换为
in()运算符,简化查询语句
内容的提问来源于stack exchange,提问作者Adeleke Abimbola
相关产品推荐
相关产品推荐

