我正在努力在KDB中编写一个 nprev 函数; xprev 函数返回第n个元素,但我需要相对于当前元素的所有prev n 元素 .
q)t:([] i:1+til 26; s:.Q.a)
q)update xp:xprev[3;]s,p:prev s from t
任何帮助是极大的赞赏 .
2 回答
6
xprev 函数基本上如下所示:
xprev1:{y til[count y]-x} //readable xprev
我们可以调整它以获得所有 n 元素
nprev:{y til[count y]-\:1+til x}
在查询中使用 nprev
q)update np: nprev[3;s] , xp1:xprev1[3;s] , xp: xprev[3;s], p:prev[s] from t
i s np xp1 xp p
-------------------
1 a " "
2 b "a " a
3 c "ba " b
4 d "cba" a a c
5 e "dcb" b b d
6 f "edc" c c e
k相当于 nprev
k)nprev:{$[0h>@y;'`rank;y(!#y)-\:1+!x]}
同样 nnext 看起来像
k)nnext:{$[0h>@y;'`rank;y(!#y)+\:1+!x]}
5
通过重复应用 prev 并翻转结果,可以获得所需的结果
q)n:3
q)select flip 1_prev\[n;s] from t
s
-----
" "
"a "
"ba "
"cba"
"dcb"
"edc"
..
2 回答
xprev
函数基本上如下所示:我们可以调整它以获得所有
n
元素在查询中使用
nprev
k相当于
nprev
同样
nnext
看起来像通过重复应用
prev
并翻转结果,可以获得所需的结果如果
n
比行数小得多,这将比一些更直接的解决方案更快 .