kdb 如何将列名传递给函数

kdb how to pass a column name into a function

作为一个简化的例子,我有

tbl:flip `sym`v1`v2!(`a`b`c`d; 50 280 1200 1800; 40 190 1300 1900)

我想将一个列名传递给函数,例如

f:{[t;c];:update v3:2 * c from t;} 

在这种形式下它不起作用。有什么建议可以实现吗? 谢谢

实现此目的的一个方法是使用 @ amend:

q){[t;c;n] @[t;n;:;2*t c]}[tbl;`v1;`v3]
sym v1   v2   v3
------------------
a   50   40   100
b   280  190  560
c   1200 1300 2400
d   1800 1900 3600

这会更新 table t 中的 c 列,将新值保存为 n 列。您也可以更改它以允许您也传递自定义函数:

{[t;c;n;f] @[t;n;:;f t c]}[tbl;`v1;`v3;{2*x}]

另一种选择是使用更新语句的函数形式。 https://code.kx.com/q/ref/funsql/#functional-sql

q)tbl:flip `sym`v1`v2!(`a`b`c`d; 50 280 1200 1800; 40 190 1300 1900)
q)parse"update v3:2*x from t"
!
`t
()
0b
(,`v3)!,(*;2;`x)
q){![x;();0b;enlist[`v3]!enlist(*;2;y)]} [tbl;`v2]
sym v1   v2   v3
------------------
a   50   40   80
b   280  190  380
c   1200 1300 2600
d   1800 1900 3800