首页 > 解决方案 > 动态构建表达式的问题

问题描述

我正在尝试构建一个通用查询,我不知道表的名称和列数。所以假设我有一张桌子,例如:

r:([] a:til 5; b:til 5; c:til 5);

我想建立一个查询来计算平均值的差异:

c:cols[r] except `date;
select a, b, c, a_dm:(a - avg a) , b_dm:(b - avg b), c_dm:(c - avg c)from r;

所以我的理解是我应该使用函数形式,即:

?[r;();0b;`a`b`c`a_dm`b_dm`c_dm!(`a;`b;`c;(-;`a;(avg;`a));(-;`b;(avg;`b));(-;`c;(avg;`c)))]

因为我不知道我会收到哪个表,也不知道它的列名,所以我需要一些通用的东西,所以我尝试了以下几行:

dmk:`$(string c),\:"_dm";
k:c,dmk;
dmv:raze "(-;",/:("`",/:string c),/'";(avg;",/:("`",/:string c),\:"));"
parse  dmv
count dmv
v:c,parse dmv
dic:k!v
?[r;();0b;dic]

我猜这不起作用,因为我的 dmv 不正常。
我完全不清楚如何解决它。如果有人可以请给我一些指示,将不胜感激。

标签: kdb

解决方案


尽管列顺序并不完全相同,但您可以尝试以下操作:

q)f:{(x,`$string[x],"_dm")!(x;(-;x;(avg;x)))}
q)
q)?[r;();0b;raze f each cols r]
a a_dm b b_dm c c_dm
--------------------
0 -2   0 -2   0 -2
1 -1   1 -1   1 -1
2 0    2 0    2 0
3 1    3 1    3 1
4 2    4 2    4 2

创建一个创建每列 where 子句字典的函数,然后应用于所有列


推荐阅读