kdb - 'where' 函数如何工作

kdb - how does the 'where' function work

我想了解以下语句发生了什么:

sum(til 100) where 000011110000b

该行的计算结果为 22,我不明白为什么。 sum(til 100)4950where 000011110000b returns 列表 4 5 6 7。 kdb 参考页面似乎没有解释这个用例。为什么上面一行的计算结果为 22?

另外,为什么下面一行会导致错误

4950 where 000011110000b

方括号用于函数调用参数,而不是圆括号。所以上面被解释为:

sum[(til 100) where 000011110000b]

现在您可能明白为什么它的计算结果为 22,即它是列表 til 100 的第 5、6、7、8 个值的总和,即 (0...99) ,因为 where 使用布尔列表 000011110000b

索引到 til 100
q)til[100] where 000011110000b
4 5 6 7

正如您所注意到的,调用函数时可以省略方括号;但是在这样做时,您需要确保它是预期的 parsed/interpreted。通常,代码是 从右到左 计算的,所以在这种情况下,首先计算 (til 100) where 000011110000b,然后将结果传递给 sum 函数。

关于 4950 where 000011110000b - 如果我们从右到左思考,解释器试图将 where 000011110000b 的结果传递给函数 4590。虽然 4590 不是 kdb 中的命名函数 - 这是用于 IPC 的格式,即通过 TCP 在其他 kdb 进程上执行命令。因此,您告诉 kdb 使用 OS 文件描述符编号 4590(这几乎肯定不会对应于有效的 TCP 连接)到 运行 命令 where 000011110000b。有关详细信息,请参阅此处的 "message formats" 部分: http://code.kx.com/q/tutorials/startingq/ipc/