我有一个表'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
已经对问题模式进行了几次讨论,如果有一个直接的解决方案,那就很好了。
谢谢。
答案 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))
或者,您可以使用键控表,而只需lj
与t
键控表lookup2
即可:
lookup2:( [date:(2018.01.01 + til 5); a:`a`b`c`d`e] b:1000*til 5)
t lj lookup2