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

我有一个表't'和一个字典'查找':

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

但是,我无法将它用于imho最明显的用例:查找特定的行值 . 这在直觉上是最简单的,但返回错误(“ERROR:'length”):

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

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

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

已经有几次遇到问题模式,如果有一个直接的解决方案会很好 .

谢谢 .

回答(2)

2 years ago

它认为应该是

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

Alternatively ,你可以使用一个键控表,只需 ljtlookup2 键控表:

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

2 years ago

Build 在@ 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