You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Kusto/ADX的range函数使用自定义时间戳字段进行分辨率查询?

如何让Kusto/ADX的range函数使用自定义时间戳字段进行分辨率查询?

当然可以啦!你完全不用被range函数默认的插入时间限制住,这里有两种实用的方法帮你基于自定义时间戳做分辨率聚合查询:

方法1:直接用bin()函数分组聚合(最常用场景)

如果你的数据在目标时间范围内基本每个时间桶都有记录,直接用bin()对自定义时间戳做粒度划分,再聚合计算就够了,这比用range更直接高效。

举个例子,假设你的表名为MyTimeSeriesTable,自定义时间戳字段是CustomTimestamp,要计算最近15分钟内的1分钟平均值,可以这么写:

MyTimeSeriesTable
| where CustomTimestamp between (ago(15m) and now()) // 筛选目标15分钟窗口内的数据
| summarize 1分钟平均值 = avg(你的数值字段名) by bin(CustomTimestamp, 1m) // 按1分钟粒度分组求平均
| order by CustomTimestamp asc // 按时间排序结果

这个方法的核心是bin(CustomTimestamp, 1m)——它会把所有自定义时间戳向下对齐到最近的1分钟边界,然后我们基于这个对齐后的时间分组聚合,完全绕开了插入时间的影响。

方法2:用range生成连续时间序列+关联数据(适合补全空时间桶)

如果有些时间桶没有数据,你希望结果里哪怕是空桶也要显示出来(比如显示0或者null),那就可以用range先生成连续的时间序列,再和你的聚合数据关联:

// 第一步:生成15分钟内、间隔1分钟的连续时间桶序列
let 连续时间桶 = range 时间桶 from ago(15m) to now() step 1m;
// 第二步:关联原表的聚合结果,左连接保证所有时间桶都保留
连续时间桶
| join kind=leftouter (
    MyTimeSeriesTable
    | where CustomTimestamp between (ago(15m) and now())
    | summarize 1分钟平均值 = avg(你的数值字段名) by bin(CustomTimestamp, 1m)
) on $left.时间桶 == $right.CustomTimestamp
| project 时间桶, 1分钟平均值 = coalesce(1分钟平均值, 0.0) // 可选:把空值替换为0
| order by 时间桶 asc

这里range只是用来生成你需要的时间框架,真正和自定义时间戳关联的是后面的join操作——我们把range生成的时间桶和原表中按自定义时间戳聚合后的结果匹配,这样就能得到完整的时间序列结果。

简单来说,range本身并不“使用”自定义时间戳,但通过和bin()、join配合,完全可以实现基于自定义时间戳的分辨率查询需求~

备注:内容来源于stack exchange,提问作者Andresch Serj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:35:26