有没有办法遍历kdb中的字母?

时间:2019-01-10 15:24:51

标签: kdb

我正在编写一个函数,用于从数据库中选择所有以字母“ A”开头,然后是“ B”,再到字母“ Z”开头的符号。我有一个虚拟表,其中设置了3个字符,如下所示...

t:([]symbol:`A`App`B`Bapp`C`Capp; price:104.3 124.3 134.2 103.4 402.7 209.8; ID:1 2 3 4 5 6)

还有从表中看起来像x ...的功能...

fetch:{[x;y]select from x where symbol like y}

然后我为每个字母调用该函数并更新到新表...

fetchedA:h (`fetch; `t; "A*")
fetchedB:h (`fetch; `t; "B*")
fetchedC:h (`fetch; `t; "C*")

新的空表以及upsert函数...

newNormData:([]symbol:`$(); price:`float$(); ID:`int$())
newNorm:{[x] `newNormData upsert x}

h (`newNorm; fetchedA)
h (`newNorm; fetchedB)
h (`newNorm; fetchedC)

我不必每次对服务器进行26次函数调用,而是要进行1次遍历字母表中每个字符的调用。在kdb / q中执行此操作的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

我相信您正在寻找fetch[t] each .Q.A,'"*"。您可以执行此操作,并通过运行

升级到新表
h({`newNormData upsert fetch[`t] x;}';.Q.A,'"*")

客户端。

或者,如果您希望添加仅以大写字母开头并按字母顺序排列的符号,则执行起来可能会更简单

newNormData:`symbol xasc select from t where symbol like "[A-Z]*"

相反。

答案 1 :(得分:2)

.Q.a提供小写字母列表,.Q.A提供大写字母列表。您可以将其用于迭代。有几种方法可以做到这一点:

  1. 对字符的简单迭代,并对每个字符进行调用。效率较低,因为这会导致许多rpc调用。

     q)  fetchAll: raze{h (`fetch; `t;x}) each .Q.A,'"*"
    
  2. 效率更高,因为它只进行1次rpc调用。使用“喜欢”功能来选择图案。例如,以下命令将选择以A或B开头的符号。

    Ex:从表格中选择“ [A | B] *”之类的符号

下面的命令将考虑所有字符。

    q)  h(`fetch; `t;"[",("|" sv enlist each .Q.A),"]*")

如果表和函数都在同一台服务器上,则不需要其他rpc调用即可先获取符号数据,然后更新newNorm表。您可以在一个电话中完成此操作。一种方法是在服务器上定义函数并调用它。

服务器上的功能

  q) fetchAndUpdNorm:{[x]`newNormData upsert fetch[t] x}

在客户端上:

  q)  h(`fetchAndUpdNorm;"[",("|" sv enlist each .Q.A),"]*")

基于Jonathon评论的更新:

第二个示例的替代命令:

 q)  h(`fetch; `t;"[A-Z]*")

对于最后一种情况:

 q)  h(`fetchAndUpdNorm;"[A-Z]*")