类似于 kdb 中的表的实用程序
Utility like except for tables in kdb
因为我们有 except 函数用于 kdb 中的列表以查找存在于一个列表中而不存在于另一个列表中的元素,类似地我们是否有任何实用程序来提取存在于一个 table 中而不存在于另一个列表中的行另一个基于列?
例如:我有两个 tables:
l:([]c1:`a`b`c`d;c2:10 20 30 40)
r:([]c1:`a`a`a`b`b;c3:100 200 300 400 50)
因为,对于 table l 中的 c1 列,我们有 c d
行,它不存在于 table r.
的 c1 列中
我们在 kdb 中是否有任何实用程序可用于获取如下所示的输出?
c1 c2
-----
c 30
d 40
我使用 -
获得了输出
select from l where c1 in l[`c1] except r`c1
但是,我正在搜索 better/optimised solution/utility 以获得相同的输出。
我认为您当前的实现没有任何问题,但您可以在键控 table 上使用 drop
(又名 _
)以获得更简洁的方法:
q)#[1#`c1;r]_1!l
c1| c2
--| --
c | 30
d | 40
当 "key" 多于一列时,这也很整洁:
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: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]
因为我们有 except 函数用于 kdb 中的列表以查找存在于一个列表中而不存在于另一个列表中的元素,类似地我们是否有任何实用程序来提取存在于一个 table 中而不存在于另一个列表中的行另一个基于列?
例如:我有两个 tables:
l:([]c1:`a`b`c`d;c2:10 20 30 40)
r:([]c1:`a`a`a`b`b;c3:100 200 300 400 50)
因为,对于 table l 中的 c1 列,我们有 c d
行,它不存在于 table r.
的 c1 列中
我们在 kdb 中是否有任何实用程序可用于获取如下所示的输出?
c1 c2
-----
c 30
d 40
我使用 -
获得了输出select from l where c1 in l[`c1] except r`c1
但是,我正在搜索 better/optimised solution/utility 以获得相同的输出。
我认为您当前的实现没有任何问题,但您可以在键控 table 上使用 drop
(又名 _
)以获得更简洁的方法:
q)#[1#`c1;r]_1!l
c1| c2
--| --
c | 30
d | 40
当 "key" 多于一列时,这也很整洁:
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: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]