使用上副词在桌子上操作

时间:2018-11-25 17:06:36

标签: kdb

给出一个以二进位函数f为参数的

x:密钥表
y:表示要创建的行的键值

并假设更新操作需要串行运行(而不是批量操作),并且一旦填充了该密钥,我们将忽略对其的进一步更新:

q)tbl:([col1:()];col2:())
q)kv:10?`a`b`c`d
q)f:{[x;y]if[y in key[x];:x];x upsert (y;1?10)}

q)(f/)[enlist[tbl],kv]
col1| col2
----| ----
a   | 9
b   | 2
c   | 1
d   | 8

是否有更正确的方法来构建呼叫?将两个输入混合到一个输入列表中感觉有点像黑客,并且引发了有关如何容纳带有两个以上参数的函数的问题。

2 个答案:

答案 0 :(得分:2)

这需要一个小的调整:

q)(f/)[tbl;kv]

这已在KX Wiki(https://code.kx.com/wiki/Reference/Slash)上涵盖

/ -  f/[y] is equivalent to f[f[..f[f[y0;y1];y2];..yn-1];yn]
q)+/[1 2 3]
6
q)(f/)[enlist[tbl],kv]  /joining both arguments to a single list

/ - f/[x;y] is equivalent to f[f[..f[f[x;y0];y1];..yn-1];yn] 
q)+/[10;1 2 3]
16
q)(f/)[tbl;kv]    / here we are passing the table as first argument 

答案 1 :(得分:0)

也许在不同的输入上运行upsert效率更高?

(tbl upsert)/[flip(d;(count d:distinct kv)?10)]