q/KDB - nprev函数获取所有前面的n个元素
q/KDB - nprev function to get all the previous n elements
我正在努力在 KDB 中编写 nprev
函数; xprev
函数 returns 第 n 个元素,但我需要相对于当前元素的所有前 n
个元素。
q)t:([] i:1+til 26; s:.Q.a)
q)update xp:xprev[3;]s,p:prev s from t
非常感谢任何帮助。
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]}
您可以通过重复应用prev
并翻转结果
来达到您想要的结果
q)n:3
q)select flip 1_prev\[n;s] from t
s
-----
" "
"a "
"ba "
"cba"
"dcb"
"edc"
..
如果 n
比行数小得多,这将比一些更直接的解决方案更快。
我正在努力在 KDB 中编写 nprev
函数; xprev
函数 returns 第 n 个元素,但我需要相对于当前元素的所有前 n
个元素。
q)t:([] i:1+til 26; s:.Q.a)
q)update xp:xprev[3;]s,p:prev s from t
非常感谢任何帮助。
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]}
您可以通过重复应用prev
并翻转结果
q)n:3
q)select flip 1_prev\[n;s] from t
s
-----
" "
"a "
"ba "
"cba"
"dcb"
"edc"
..
如果 n
比行数小得多,这将比一些更直接的解决方案更快。