Kusto查询:按ID获取对应最大时间戳的所有行数据
Kusto获取每个ID对应最新时间戳全量行的实现
核心思路
不要直接用arg_max做单步聚合,先按ID维度计算每个ID对应的全局最大时间戳,再回表过滤匹配所有时间戳等于该最大值的记录,即可保留同最新时间戳下所有业务列不同的行。
正确查询写法
source // 第一步:计算每个ID对应的全局最大时间戳 | summarize LatestTimestamp = max(Timestamp) by ID // 第二步:关联回原表 | join kind=inner (source) on ID // 第三步:筛选出时间戳匹配最新值的所有行 | where Timestamp == LatestTimestamp // 移除临时计算的辅助字段,保留原表全部业务列 | project-away LatestTimestamp
原有写法的问题说明
- 写法1:
source | summarize arg_max(Timestamp, *) by IDarg_max函数的设计逻辑是返回每个分组下命中极值的单条记录,不会自动返回同极值的其他行,因此会丢失同一最新时间戳下业务列取值不同的记录。 - 写法2:
source | summarize arg_max(Timestamp, *) by ID, other_column
该写法把分组粒度细化为「ID+其他业务列」的组合,计算得到的是每个组合维度下的最大时间戳,而非ID维度的全局最大时间戳,因此会返回大量不属于ID全局最新时间的历史数据。
性能优化提示
如果表数据量极大,且ID基数较高,可以在关联前对原表做必要的字段裁剪,只保留需要用到的业务列,减少join阶段的数据传输量。
内容的提问来源于stack exchange,提问作者M. Köppen
相关产品推荐
相关产品推荐

