将列名作为参数传递给KDB选择查询?

时间:2019-05-31 03:31:44

标签: kdb

我想将列名传递给Q函数以查询已加载的表。

示例:

getPosts

这不起作用,因为Q文档说我不能将列作为参数传递。有没有办法绕过这个?

2 个答案:

答案 0 :(得分:3)

当q解释x时,它将把它视为字符串,它没有对该列的引用,因此您的输出将仅计为“ HEADER”。

如果您想将列作为字符串传递,则需要构建整个select语句,然后使用value

{value "select count  ",x," from tab"} "HEADER"

但是,推荐的方法是使用functional select。下面,我使用parse使用解析树来构建等效的功能选择。

/Create sample table
tab:([]inst:10?`MSFT`GOOG`AAPL;time:10?.z.p;price:10?10f)

/Generate my parse tree to get my functional form
.Q.s parse "select count i by inst from tab"

/Build this into my function
{?[`tab;();(enlist x)!enlist x;(enlist `countDistinct)!enlist (#:;`i)]} `inst

请注意,您必须将列作为符号传递进来。另外,#:i只是等于i的k。

更新多列

tab:([]inst:10?`MSFT`GOOG`AAPL;time:10?.z.p;price:10?10f;cntr:10`HK`SG`UK`US)
{?[`tab;();(x)!x;(enlist `countDistinct)!enlist (#:;`i)]} `inst`cntr

答案 1 :(得分:0)

要获取select语句的功能形式,建议使用buildSelect。另外,请减小括号的范围,即使用enlist[`countDistinct]代替(enlist `countDistinct)