首页 文章

q / KDB - 用于获取所有前n个元素的nprev函数

提问于
浏览
4

我正在努力在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"
    ..
    

    如果 n 比行数小得多,这将比一些更直接的解决方案更快 .

相关问题