q中exec的功能形式

时间:2018-09-10 16:53:41

标签: kdb

考虑以下示例:

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

2 个答案:

答案 0 :(得分:5)

wiki仅声明多列需要词典,而不是我所能理解的原因。要查看q如何解释您的查询,您可以使用parse。对于您上面给出的查询:

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

在这里,我们看到它并不像传递列名列表那么简单。

如果您想直接传递列名,可以这样“执行”:

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

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

答案 1 :(得分:4)

正如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