kdb - 'where'功能如何工作

时间:2016-12-29 07:11:02

标签: kdb

我想了解以下声明中发生的事情:

sum(til 100) where 000011110000b

该行评估为22,我无法弄清楚原因。 sum(til 100)4950where 000011110000b返回列表4 5 6 7。 kdb参考页面似乎没有解释这个用例。为什么上面的行评估为22?

另外,为什么以下行导致错误

4950 where 000011110000b

1 个答案:

答案 0 :(得分:3)

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

sum[(til 100) where 000011110000b]

你现在可以看到为什么它会评估为22,即它是列表til 100的第5,第6,第7,第8个值的总和,即(0 ... 99),因为where使用布尔列表til 100

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

正如您将注意到的,在调用函数时可以省略方括号;但是这样做时你需要确保它将被解析/解释为预期。通常,代码将从从右向左进行评估,因此在这种情况下,首先评估(til 100) where 000011110000b,并将结果传递给sum函数。

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