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

Is there a way to iterate through the alphabet in kdb?

我正在为 select 数据库中以字母 "A" 开头的所有符号编写一个函数,然后是 "B",直到字母 "Z" .我有一个虚拟 table 设置了 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)

以及从 table 到 select 的函数,其中符号看起来像 x...

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

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

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

新空 table 以及 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 中执行此操作的正确方法是什么?

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

更新到新的 table
h({`newNormData upsert fetch[`t] x;}';.Q.A,'"*")

客户端。

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

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

相反。

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

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

      q)  fetchAll: raze{h (`fetch; `t;x}) each .Q.A,'"*"
    
  2. 效率更高,因为它只进行 1 次 rpc 调用。使用 'like' 功能在模式中进行替代选择。例如下面的命令将 select 以 A 或 B 开头的符号。

    例如:select 来自 table,其中符号如“[A|B]*”

以下命令将考虑所有字符。

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

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

服务器上的函数:

  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]*")