前向窗口的 KDB msum?

问题描述 投票:0回答:1

如何对大型时间排序表执行 msum 的前向版本,而不必反转顺序两次或应用接下来的 n 次?

t:([] val:1000000?1f);
t:update sym:(count i)?`AA`BB`CC from t;
t:update nextsums: msumfwd[100000;val] by sym from t;

所有这些选项都很慢:

msumfwd:{next reverse x msum reverse y}
msumfwd2:{(x)_ x msum y,x#0}
msumfwd3:{(neg x) xprev (x msum y)}
msumfwd4:{sum 1_(x) next\y}
kdb
1个回答
0
投票

如果你能比反向方法更快的话我会感到惊讶(反向方法很便宜,并且 msum 是内置的)。

我以为使用另一个内置插件会很快,但事实并非如此

q)tl:{1f\[sum x#y;(x _y,x#0)-y]};
q)exec a cor b from update a:tl[100000;val],b:msumfwd[100000;val] by sym from t
1f

基于 https://code.kx.com/q/ref/accumulators/#alternative-syntax

如果能更快一点就好了,但是可惜

© www.soinside.com 2019 - 2024. All rights reserved.