函数以kdb / q

时间:2018-06-29 15:43:30

标签: kdb

我是kdb / q的新手,并且对kdb \ q函数不熟悉,希望有人可以帮助我。这是问题: 我有一个简单的q函数声明如下:

func:{[x;y] x+y}

{[x;y] x+y}[3;4]给了我答案7。一切正常。

如果我有一个包含两列的表t,例如:

_x   _y
--------
3     4
2     5
6     2
...

我可以在q中使用一个函数来为表x+y的每一行计算t吗? 我的预期回报将是:

res
---
7
7
8
...

非常感谢!

2 个答案:

答案 0 :(得分:3)

您只需将列名作为参数传递给函数:

q)tab:([]x:1 2 3;y:4 5 6)
q)func:{[x;y] x+y}
q)
q)select res:func[x;y]from tab
res
---
5
7
9

或者,您可以使用函数形式将查询转换为函数:

q){?[x;();0b;enlist[`res]!enlist(`func;y;z)]}[tab;`x;`y]
res
---
5
7
9

答案 1 :(得分:1)

由于+被重载以同时与atom和list一起使用,因此res:func[x;y]可以很好地工作;但是,如果二进位函数仅接受参数作为原子而不是列表,则each-both可以解决问题:

q)select res:func'[x;y] from tab  // using each-both func'[x;y]
res
---
5
7
9

例如,从列c中选择与s一样多的字符

tab2:([] c:1 2 3;s:("123";"1234";"123456"))
q)update res:#'[c;s] from tab2  //func'[x;y]
c   s         res
-----------------------
1   "123"     enlist "1"
2   "1234"    "12"
3   "123456"  "123"