如何用KQL查询获取各Resource/MetricName组合的最新Timestamp对应MetricValue
问题描述
现有如下时间序列数据:
| Timestamp | Resource | MetricName | MetricValue |
|---|---|---|---|
| T1 | db1 | DocumentCount | 110 |
| T2 | db1 | DocumentCount | 120 |
| T2 | db1 | DataUsage | 40000 |
| T11 | db2 | DocumentCount | 60 |
| T12 | db2 | DocumentCount | 70 |
| T21 | db3 | DataUsage | 100000 |
| T22 | db3 | DataUsage | 150000 |
需要编写KQL查询,获取每个Resource/MetricName组合对应的最新Timestamp的MetricValue,期望结果如下:
| Timestamp | Resource | MetricName | MetricValue |
|---|---|---|---|
| T2 | db1 | DocumentCount | 120 |
| T2 | db1 | DataUsage | 40000 |
| T12 | db2 | DocumentCount | 70 |
| T22 | db3 | DataUsage | 150000 |
解决方案
方法1:使用arg_max()函数(推荐)
arg_max()是Kusto中专门用于获取分组内指定列最大值对应行数据的函数,适配这类场景:
-- 替换MetricsTable为你的实际表名 MetricsTable | summarize arg_max(Timestamp, MetricValue) by Resource, MetricName | project Timestamp, Resource, MetricName, MetricValue
说明:
summarize arg_max(Timestamp, MetricValue) by Resource, MetricName:按Resource和MetricName分组,筛选出每组中Timestamp最大的行,同时保留对应的MetricValueproject:调整列的顺序,与期望结果匹配
方法2:使用partition by分组排序
通过对每个分组单独排序后取首行,同样可以实现需求:
-- 替换MetricsTable为你的实际表名 MetricsTable | partition by Resource, MetricName ( sort by Timestamp desc | take 1 )
说明:
partition by Resource, MetricName:将数据按指定字段拆分为独立分组- 每个分组内按
Timestamp降序排序,取第一行即为该分组的最新数据
内容的提问来源于stack exchange,提问作者Jerald Baker
相关产品推荐
相关产品推荐

