如何在Kusto中定义任意大小窗口实现通用聚合查询
实现方法
不需要重复调用prev()函数,直接使用Kusto原生支持的窗口聚合语法即可实现任意大小的滑动行窗口计算,性能远高于堆叠prev()的写法,且调整窗口大小只需要修改单个参数。
对应计算按时间升序排列后,当前行前100行Value字段最大值的查询写法如下:
mytable | sort by Time asc | extend prev_100_max = max(Value) over (rows between 100 preceding and 1 preceding)
语法说明
- 窗口范围通过
rows between 起始边界 and 结束边界定义:100 preceding代表窗口起始位置是当前行往前数第100行1 preceding代表窗口结束位置是当前行的前1行,完全匹配“取当前行之前100行数据”的需求
- 数据集开头不足100行的边界场景会被自动处理:比如当前行是第20行,窗口会自动取第1行到第19行的所有数据计算最大值,不需要额外写边界判断逻辑。
- 如果要调整窗口大小,只需要修改
preceding前的数字即可,比如要对齐你原来示例里取前3行最大值的逻辑,只需要把范围改成rows between 3 preceding and 1 preceding,和原来写3次prev()的计算结果完全一致。
如果需要按指定维度分组计算滑动窗口(比如按设备ID分组,单独统计每个设备自身的前100行最大值),只需要在
over子句中增加partition by分组字段即可,示例:| extend prev_100_max = max(Value) over (partition by DeviceId rows between 100 preceding and 1 preceding)
内容的提问来源于stack exchange,提问作者greatvovan
相关产品推荐
相关产品推荐

