q 中 exec 的函数形式

functional form of exec in q

考虑流动的例子:

q)\l sp.q
q)exec (qty;s) from sp
300 200 400 200 100 100 300 400 200 200 300 400
s1  s1  s1  s1  s4  s1  s2  s2  s3  s4  s4  s1

我想以函数形式编写它,对我来说最明显的方法是:

q)?[sp;();();(`qty;`s)]
300 300 300 300 200 300 200 200 400 200 200 200

但它不能给我正确的结果。结果对我来说不直观,为什么这个表格不行?

我必须做的:

q)value ?[sp;();();`qty`s!`qty`s]
300 200 400 200 100 100 300 400 200 200 300 400
s1  s1  s1  s1  s4  s1  s2  s2  s3  s4  s4  s4

wiki 仅说明多列需要字典,据我所知没有说明原因。要查看 q 如何解释您的查询,您可以使用 parse。对于您在上面给出的查询:

q)parse"exec (qty;s) from sp"
?
`sp
()
()
,(enlist;`qty;`s)

这里我们可以看出它并不像传递列名列表那么简单。

如果您想直接传递列名,您可以 "exec" 这样:

q)sp`qty`s
300 200 400 200 100 100 300 400 200 200 300 400
s1  s1  s1  s1  s4  s1  s2  s2  s3  s4  s4  s1

请注意,这仅适用于内存中未加密的 tables(无分区)。如果 table 是键控的,你可以 运行 (0!sp)`qty`s 其中 0! 是无列键控的快捷方式。

正如 Thomas 指出的那样 - 您应该解析 exec 语句并以函数形式重新创建其输出,这将是

q)?[sp;();();enlist,`qty`s]
300 200 400 200 100 100 300 400 200 200 300 400
s1  s1  s1  s1  s4  s1  s2  s2  s3  s4  s4  s1