kdb - 如何使用函数 select 创建动态列列表的总和

kdb - how to create sum a list of dynamic columns using functional select

我希望能够在给定 `a`b`c

列表的情况下构建 (+; (+; `a; `b); `c)

同样,如果我有 `a`b`c`d 的列表,我希望能够构建另一个巢,依此类推。

我一直在尝试使用扫描,但无法正确使用

如果您只想要原始解析树输出,一种方法是形成等效字符串并使用 parse。对于更复杂的示例,不建议这样做,但在这种情况下很清楚。

{parse "+" sv string x}[`a`b`c`d]
+
`d
(+;`c;(+;`b;`a))

如果您想在函数 select 中使用它,我们可以使用 +/ 而不是单独添加每一列,就像您在示例中指定的那样

q)parse"+/[(a;b;c;d)]"
(/;+)
(enlist;`a;`b;`c;`d)

q)f:{[t;c] ?[t;();0b;enlist[`res]!enlist <b>(+/;(enlist,c))</b>]}; 
q)t:([]a:1 2 3;b:4 5 6;c:7 8 9;d:10 11 12)

q)f[t;`a`b`c]
res
---
12 
15 
18 

q)f[t;`a`b]
res
---
5  
7  
9  

q)f[t;`a`b`c]~?[t;();0b;enlist[`res]!enlist (+;(+;`a;`b);`c)]
1b

您还可以通过直接索引 return 每个列值的列表并对这些值求和来获得总和。我们使用 (), 将任何输入转换为列表,否则它将对该单列中的值求和,并且 return 只有一个值

q)f:{[t;c] sum t (),c}
q)f[t;`a`b`c]
12 15 18
q)fsum:(+;;)/
enlist[+;;]/

q)fsum `a`b`c`d
+
(+;(+;`a;`b);`c)
`d