除了kdb中的list函数之外,我们还可以查找一个列表中存在的元素,而不是另一个列表中的元素,同样,我们有什么实用工具可以根据列提取一个表中的行而不是另一个表中的行呢?
我有两张桌子:
l:([]c1:`a`b`c`d;c2:10 20 30 40)
r:([]c1:`a`a`a`b`b;c3:100 200 300 400 50)因为,对于表1中的列c1,表r的列c1中不存在行c d。
我们在kdb中有什么实用工具,可以像下面这样用于输出吗?
c1 c2
-----
c 30
d 40我用-
select from l where c1 in l[`c1] except r`c1但是,我正在寻找更好的/优化的解决方案/实用程序,以获得相同的输出。
发布于 2020-02-11 17:09:37
我不认为当前的实现有什么问题,但您可以在键控表上使用drop (又名_),以获得更简洁的方法:
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发布于 2020-02-11 17:23:58
一种更实用的形式是:
{cl:cols[x]inter cols y;x where not(cl#x)in cl#y}[l;r]
c1 c2
-----
c 30
d 40如果您不知道要匹配的列,因为cols[x] inter cols[y]在开始时获得了两个表之间的公共科尔,那么这个方法应该可以工作。它也不需要键控列也能工作。
尽管在这种具体情况下,以下内容可能会更快一些:
l where not l[`c1] in r[`c1] https://stackoverflow.com/questions/60173431
复制相似问题