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
作为一个简化的例子,我有
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