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

How to look up from dictionary inside update statement?

我有一本 table '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

但是,我无法将它用于恕我直言最明显的用例:查找特定的行值。这在直觉上是最简单的,但是 returns 一个错误 ("ERROR: 'length"):

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

也想过使用索引,但也没用:

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

这个问题模式已经遇到过几次了,如果有一个直接的解决方案就好了。

谢谢。

觉得应该

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))

或者,您可以使用键控 table 并简单地 lj table tlookup2 键控 table :

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

基于@nyi 的回答。 翻转的另一种方法是使用 join each ,' 这会稍微快一些,但在更大的数据集上可能会很明显

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