简化多个更新语句 - KDB

时间:2018-06-06 17:27:57

标签: kdb

我有一个包含多个标志的表,我想将这些标志映射到它们所代表的值。

tab:([] t:til 4 ; f1:1100b;f2:1010b;f3:0101b;f4:0011b )

如何简化这些多个更新语句?

tab:update f1s:`googl from tab where f1
tab:update f2s:`appl from tab where f2
tab:update f3s:`amzn from tab where f3

4 个答案:

答案 0 :(得分:5)

update f1s:``googl f1,f2s:``appl f2,f3s:``amzn f3 from `tab

您可以将符号放在列表中并使用布尔值将其编入索引

答案 1 :(得分:1)

更实用的解决方案

q)@/[tab;`f1`f2`f3;(``goog;``appl;``amzn)]
t f1   f2   f3   f4
-------------------
0 goog appl      0
1 goog      amzn 0
2      appl      1
3           amzn 1

答案 2 :(得分:0)

您可以使用向量条件运算符?

?[vb;exprtrue;exprfalse]

Simplfied声明:

update f1s:?[f1;`googl ;`], f2s:?[f2;`appl ;`], f3s:?[f3;`amzn ;`] from tab

答案 3 :(得分:0)

也可以通过使用词典来实现:

tab:([] t:til 4 ; f1:1100b;f2:1010b;f3:0101b;f4:0011b )
g:01b!``googl 
ap:01b!``appl 
az:01b!``amzn

update f1s:g@f1, f2s:ap@f2, f3s:az@f3 from tab

这在单列中有多个值的情况下特别有用:

q)tab:([] t:til 4 ; f1:1 2 0 4;f2:2 3 4 1;f3:1 4 3 1 ;f4:1 1 0 0 )
q)m:1 2 3!`googl`appl`amzn 
q)update f1s:m@f1, f2s:m@f2, f3s:m@f3 from tab

t f1 f2 f3 f4 f1s   f2s   f3s
-------------------------------
0 1  2  1  1  googl appl  googl
1 2  3  4  1  appl  amzn
2 0  4  3  0              amzn
3 4  1  1  0        googl googl