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

问题描述

我有2个具有相同列的表。但是,一个表包含BUY数据,而另一个表包含SELL数据。该表的第一列是ID,并且表的行数可能不同。 如果ID的值相同,如何在2个表中添加列的值?例如,我要添加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

解决方法

在这种情况下,您可以使用pj。要使用pj,必须对表进行键控以使联接起作用,并且返回的结果将包括与键控表匹配的行。请参阅文章底部的链接。

x++

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

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

另一种解决方法是:

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

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

,

您可以使用加号联接添加用于匹配ID的表,然后联接表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/

,

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...