如何在 kdb 中进行完全右外连接?
How to do full right outer join in kdb?
我有这两个table。
tab1:([]col1:`abc`def`ghi;col2:2 4 6);
tab2:([]col1:`def`ghi`ghi`rrr;col3:5 10 11 15);
我想让所有内容都保持正确 table 但复制了 col1 以匹配 tab2 中的 col1。我找到的最接近的是 ij
tab2 ij 1! tab1
col1 col3 col2
--------------
def 5 4
ghi 10 6
ghi 11 6
但是,我想产生这样的结果:
col1 col3 col2
--------------
abc 2
def 5 4
ghi 10 6
ghi 11 6
如果 tab2 中的 col1 中还有其他值,我不想将其放入结果 table:就像我不希望 `rrr 在那里一样。
这应该能满足您的需求:
q){x,flip y}/[tab1 lj `col1 xgroup tab2]
col1 col2 col3
------------------
abc 2 `long$()
def 4 5
ghi 6 10
ghi 6 11
没有经过严格测试,但它是一个起点!
编辑:实际上,它比这更微妙。当 col3 中有空白列表时,翻转会导致问题,上面的示例恰好避免了这种情况。
您可能需要这样的东西来捕捉边缘情况:
q){x,$[0=count f:flip y;enlist first each y;f]}/[();tab1 lj `col1 xgroup tab2]
col1 col2 col3
--------------
abc 2
def 4 5
ghi 6 10
ghi 6 11
这个怎么样?
q)uj[select from tab1 where not col1 in exec col1 from tab2;tab2 ij 1!tab1]
col1 col2 col3
--------------
abc 2
def 4 5
ghi 6 10
ghi 6 11
这里我们将 union 应用于 a) tab1
中不存在于 tab2
中的所有内容和 b) tab1
和 [ 中存在的所有内容=25=] tab2
.
不确定我们是否可以将此称为完全外右连接,因为我们不想包含 tab2 中的所有 条记录(rrr
在这种情况下)但这是一个术语问题。
我有这两个table。
tab1:([]col1:`abc`def`ghi;col2:2 4 6);
tab2:([]col1:`def`ghi`ghi`rrr;col3:5 10 11 15);
我想让所有内容都保持正确 table 但复制了 col1 以匹配 tab2 中的 col1。我找到的最接近的是 ij
tab2 ij 1! tab1
col1 col3 col2
--------------
def 5 4
ghi 10 6
ghi 11 6
但是,我想产生这样的结果:
col1 col3 col2
--------------
abc 2
def 5 4
ghi 10 6
ghi 11 6
如果 tab2 中的 col1 中还有其他值,我不想将其放入结果 table:就像我不希望 `rrr 在那里一样。
这应该能满足您的需求:
q){x,flip y}/[tab1 lj `col1 xgroup tab2]
col1 col2 col3
------------------
abc 2 `long$()
def 4 5
ghi 6 10
ghi 6 11
没有经过严格测试,但它是一个起点!
编辑:实际上,它比这更微妙。当 col3 中有空白列表时,翻转会导致问题,上面的示例恰好避免了这种情况。
您可能需要这样的东西来捕捉边缘情况:
q){x,$[0=count f:flip y;enlist first each y;f]}/[();tab1 lj `col1 xgroup tab2]
col1 col2 col3
--------------
abc 2
def 4 5
ghi 6 10
ghi 6 11
这个怎么样?
q)uj[select from tab1 where not col1 in exec col1 from tab2;tab2 ij 1!tab1]
col1 col2 col3
--------------
abc 2
def 4 5
ghi 6 10
ghi 6 11
这里我们将 union 应用于 a) tab1
中不存在于 tab2
中的所有内容和 b) tab1
和 [ 中存在的所有内容=25=] tab2
.
不确定我们是否可以将此称为完全外右连接,因为我们不想包含 tab2 中的所有 条记录(rrr
在这种情况下)但这是一个术语问题。