kdb第一次出现时如何aj

时间:2016-05-16 15:49:46

标签: kdb

这是我的问题:

我有两张桌子:

q)t1:([]sym:1 5;x: 90 90)
q)t2:([]sym: 2 3 4 6 7 8; y: 100 200 300 400 500 600)

如果我aj[`sym;t2;t1],结果表中的所有6列都将包含值为90的x。

但我想要的是仅在sym 2和6行中的第x列中的值90,即表sym中的t2第一次出现在表{{1}之前}。

换句话说,我希望结果表是这样的:

t1

有人能告诉我如何实现这一目标吗?非常感谢你!

2 个答案:

答案 0 :(得分:1)

不确定是否可以在这种意义上使用aj。这可能会为您提供所需:

q)t2 lj 1!update sym:{x x binr y}[t2.sym;sym] from t1
sym y   x
----------
2   100 90
3   200
4   300
6   400 90
7   500
8   600

使用binr查找大于t1中值的下一个值,然后仅加入该值。

编辑:还要注意binr是> = .....如果你需要严格大于你可以使用的

q)t2 lj 1!update sym:{x 1+x bin y}[t2.sym;sym] from t1
sym y   x
----------
2   100 90
3   200
5   300
6   400 90
7   500
8   600

答案 1 :(得分:0)

你可以做aj来获得最接近的较小x数的索引,然后是一个向量条件,当该索引增加时得到x,即

select sym, y, x:?[c>prev c;x;0n] from aj[`sym; t2; update c:i from t1]