kdb - 使用maps和lj简化查询

时间:2018-04-18 17:05:39

标签: kdb

我已经将几张表加载到内存中

//the real table is huge
st:([] s:`a`a`a`b`b`b;n:3 5 7 3 5 7; v:`U20`U30`U50`U22`U33`U44)

//step function
st1:`s#select first v by s,n from st

//mapping function 
f:{  (st1([] s:(),x 0;n:(),x 1))`v}

/Another table
t:([] s:`a`b`b;v:4 6 8)

//user input
MAP:([ KEY:`U20`U33`M40 ] VAL:200 330 440 )

有没有办法简化以下方法?在这里,我要为KEY创建一个临时列lj,然后将其删除

delete KEY from (update KEY:first each f each (s,'v) from t) lj MAP

3 个答案:

答案 0 :(得分:3)

可以通过一行来完成,并通过形成表来索引到其他表来避免f。这应该通过避免每个连接和最后一行中的每个(

)来对其进行矢量化并使其更快
q)update VAL:MAP[([]KEY:st1[([]s;n:v);`v]);`VAL] from t
s v VAL
-------
a 4 200
b 6 330
b 8
q)

答案 1 :(得分:2)

为什么不对列名进行同步,以便可以直接进行键表查找?

q)st:([] s:`a`a`a`b`b`b;v:3 5 7 3 5 7; KEY:`U20`U30`U50`U22`U33`U44)
q)st1:`s#select first KEY by s,v from st

q)t,'MAP st1 t
s v VAL
-------
a 4 200
b 6 330
b 8

答案 2 :(得分:0)

如果您可以将用户输入(当前是键控表)转换为字典

MAP2:`U20`U33`M40!200 330 440 

MAP2的新查询:

update VAL:MAP2@f each (s,'v) from t

实际上,以下内容更简单,更快:

update VAL:MAP2@f ( s;v) from t