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 比行数小得多,这将比一些更直接的解决方案更快。