q的执行功能形式

an *_*use 1 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
Run Code Online (Sandbox Code Playgroud)

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

q)?[sp;();();(`qty;`s)]
300 300 300 300 200 300 200 200 400 200 200 200
Run Code Online (Sandbox Code Playgroud)

但它不能给我正确的结果.结果对我来说不直观,为什么这种形式不起作用?

我要做:

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
Run Code Online (Sandbox Code Playgroud)

Tho*_*yth 5

维基只是说一本字典需要多列,不只要我能看到为什么.要查看q如何解释您的查询,您可以使用parse.对于您上面给出的查询:

q)parse"exec (qty;s) from sp"
?
`sp
()
()
,(enlist;`qty;`s)
Run Code Online (Sandbox Code Playgroud)

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

如果要直接传递列名,可以"执行":

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
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于内存中的未键控表(无分区).如果表键可以运行(0!sp)`qty`s在那里0!是一条捷径绝不列键.