我正在编写一个函数,用于从数据库中选择所有以字母“ 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中执行此操作的正确方法是什么?
答案 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提供大写字母列表。您可以将其用于迭代。有几种方法可以做到这一点:
对字符的简单迭代,并对每个字符进行调用。效率较低,因为这会导致许多rpc调用。
q) fetchAll: raze{h (`fetch; `t;x}) each .Q.A,'"*"
效率更高,因为它只进行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]*")