给出一个以二进位函数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
是否有更正确的方法来构建呼叫?将两个输入混合到一个输入列表中感觉有点像黑客,并且引发了有关如何容纳带有两个以上参数的函数的问题。
答案 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)]