【问题标题】:Utility like except for tables in kdb除了 kdb 中的表之外的实用程序
【发布时间】:2020-02-11 16:29:58
【问题描述】:

由于我们在 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


    【解决方案1】:

    我认为您当前的实现没有任何问题,但您可以在键控表上使用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
    

    【讨论】:

    • 仅供参考,其广义形式如下{#[cl;y]_(cl:inter/[cols each (x;y)])xkey x},这可能是性能更高的解决方案
    【解决方案2】:

    更实用的形式是这样的:

    {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] 
    

    【讨论】:

      猜你喜欢
      • 2018-08-18
      • 1970-01-01
      • 2011-09-07
      • 2014-01-16
      • 1970-01-01
      • 2018-06-16
      • 2011-07-19
      • 2016-12-27
      • 1970-01-01
      相关资源
      最近更新 更多