如何从字典中的更新语句中查找?

时间:2018-08-03 07:53:36

标签: kdb

我有一个表't'和一个字典'lookup':

t:([] date:2018.01.01 + til 5; a:`a`b`c`d`e)

lookup:((2018.01.01 + til 5),'`a`b`c`d`e)!(1000*til 5)

因此,查找将日期和符号列表作为键,例如:

lookup[(2018.01.03;`c)] /returns 2000j

如果我想在更新语句中使用字典,那通常可以工作:

update b:lookup[(2018.01.03;`c)] from t
update b:lookup[(last date;last a)] from t

但是,我无法将其用于恕我直言最明显的用例:查找特定的行值。从直觉上讲,这是最简单的方法,但是会返回一个错误(“ ERROR:'length”):

update b:lookup[(date;a)] from t

还考虑过使用索引,但这也不起作用:

update b:lookup[(date[i];a[i])] from t

已经对问题模式进行了几次讨论,如果有一个直接的解决方案,那就很好了。

谢谢。

2 个答案:

答案 0 :(得分:3)

以@nyi的答案为基础。 翻转的另一种方法是每个使用一个联接,' 这会稍快一些,但在较大的数据集上可能会很明显

q)\ts update b:lookup[flip (date;a)] from 1000000#t
904 101750064
q)\ts update b:lookup[date,'a] from 1000000#t
343 101750064

答案 1 :(得分:1)

它认为应该是

update b:lookup[flip (date;a)] from t

flip会将2列向量转换为单个列表,然后可将其用于查找:

flip (t`date;t`a)
((2018.01.01;`a);(2018.01.02;`b);(2018.01.03;`c);(2018.01.04;`d);(2018.01.05;`e))

或者,您可以使用键控表,而只需ljt键控表lookup2即可:

lookup2:( [date:(2018.01.01 + til 5); a:`a`b`c`d`e] b:1000*til 5)
t lj lookup2