kdb - 'where' 函数如何工作
kdb - how does the 'where' function work
我想了解以下语句发生了什么:
sum(til 100) where 000011110000b
该行的计算结果为 22,我不明白为什么。 sum(til 100)
是 4950
。 where 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/
我想了解以下语句发生了什么:
sum(til 100) where 000011110000b
该行的计算结果为 22,我不明白为什么。 sum(til 100)
是 4950
。 where 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/