KDB/Q: 根据列的值添加两个表

KDB/Q: add two tables based on the value of column(s)

我有 2 个 table 具有相同的列。然而,一个 table 包含买入数据,而另一个包含卖出数据。 table的第一列是ID,table的行数可能不一样。 如果 ID 的值相同,如何在 2 table 中添加列的值?例如,我想添加 tableA 和 tableB,输出为 tableC

tableA      tableB
ID  Qty     ID  Qty
ABC 100     ABC 90
XZY 100     TOM 60
TOM 100     ROB 40
AL  100

tableC
ID  Qty
ABC 190
XYZ 100
TOM 160
AL  100
ROB 40

您可以使用加号连接添加 tables 以匹配 ID,然后连接 table B 中与联合连接不匹配的 ID,或简单的逗号连接

q)tableA:([]ID:`ABC`XZY`TOM`AL;Qty:100 100 100 100)
q)tableB:([]ID:`ABC`TOM`ROB;Qty:90 60 40)
q)(tableA pj 1!tableB) , select from tableB where not ID in tableA`ID

https://code.kx.com/q/ref/pj/

这种情况下可以使用pj。要使用 pj,必须对 tables 进行键控才能使连接工作,并且返回的结果将包括与键控 table 匹配的行。请参阅 post 底部的 link。

q)tabA:([]ID:`ABC`XYZ`TOM`AL;Qty:100 100 100 100)
q)tabB:([]`ID`ABC`TOM`ROB;Qty:90 60 40 )
q)tabA pj 1!tabB
ID  Qty
-------
ABC 190
XYZ 100
TOM 160
AL  100
q)tabB pj 1!tabA
ID  Qty
-------
ABC 190
TOM 160
ROB 40

在您的查询中,您需要包含来自两个 table 的所有行,因此您需要创建一个包含所有 ID 的机架并在两个 table 中应用 pj 以将它们加在一起.见下文。

(pj/)((select distinct ID from tabA,select distinct from tabB);`ID xkey tabA;`ID xkey tabB)

另一种方法是:

q)(pj/)(distinct raze enlist[`ID]#/:(tableA;tableB);1!tableA;1!tableB)
ID  Qty
-------
ABC 190
XYZ 100
TOM 160
AL  100
ROB 40

https://code.kx.com/q/ref/pj/

另一种方法是将您的表格转换为字典并添加它们。字典似乎是这些表的更自然的结构,因为您将它们描述为键值对:

q)dA:`ABC`XZY`TOM`AL!100 100 100 100
q)dB:`ABC`TOM`ROB!90 60 40
q)dA+dB
ABC| 190
XZY| 100
TOM| 160
AL | 100
ROB| 40