需要先将数据分组,然后在组内计算,然后使用 HINT_KEEPORDER 保序返回结果。可以参考下述脚本:
t = table(1..10 as id, 1..10 as v) select [HINT_KEEPORDER] id, moving(sum, v, 3) from t context by rowNo(v) % 2
通过 rowNo(col)%N 可以给数据等间隔分 N 组,再通过 context by 分组计算 moving。
t = table(1..10 as id, 1..10 as v) select id, moving(sum, v, 3) from t context by rowNo(v) % 2
直接 context by 的输出结果会按照分组依次输出,如果需要保持顺序和输入一致,可以用 HINT_KEEPORDER 关键字
t = table(1..10 as id, 1..10 as v) select [HINT_KEEPORDER] id, moving(sum, v, 3) from t context by rowNo(v) % 2
上述例子中,moving 使用的函数是 sum,有对应的优化过的内置函数 msum。msum 通过增量算法实现了优化,性能会比 moving(sum, X, window) 更好。
如果 moving 使用的函数比较基础的话,可以考虑用对应的内置函数替代,比如
t = table(1..10 as id, 1..10 as v) select [HINT_KEEPORDER] id, msum(v, 3) from t context by rowNo(v) % 2