动态构建表达式的问题

problem building an expression dynamically

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

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)))]

并且因为我不知道我会收到哪个 table 也不知道它的列名我需要一些通用的东西所以我尝试了一些东西:

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 不正常。
我完全不清楚如何修复它。如果有人能给我一些指点,将不胜感激。

虽然列顺序不完全相同,但您可以这样尝试:

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 子句字典,然后应用于所有列