首页 > 解决方案 > 除了 kdb 中的表之外的实用程序

问题描述

由于我们在 kdb 中具有用于列表的除函数来查找存在于一个列表中而不存在于另一个列表中的元素,同样我们是否有任何实用程序可以根据列提取一个表中存在的行而不是另一个表中的行?

例如:我有两张桌子:

l:([]c1:`a`b`c`d;c2:10 20 30 40)
r:([]c1:`a`a`a`b`b;c3:100 200 300 400 50)

因为,对于表 l 中的 c1 列,我们有c d在表 r 的 c1 列中不存在的行。
我们在 kdb 中是否有任何实用程序可用于获取如下输出?

c1 c2
-----
c  30
d  40

我使用 -

select from l where c1 in l[`c1] except r`c1

但是,我正在寻找更好/优化的解决方案/实用程序来获得相同的输出。

标签: kdb

解决方案


我认为您当前的实现没有任何问题,但您可以在键控表上使用drop(aka _) 以获得更简洁的方法:

q)#[1#`c1;r]_1!l
c1| c2
--| --
c | 30
d | 40

当他们的“关键”不止一列时,这也很整洁:

l0:([]c0:`x`y`z`w;c1:`a`b`c`d;c2:10 20 30 40)
r0:([]c0:`y`x`x`x`y;c1:`a`a`a`b`b;c3:100 200 300 400 50)

q)#[`c0`c1;r0]_2!l0
c0 c1| c2
-----| --
z  c | 30
w  d | 40

推荐阅读