kdb/q 如何根据两个相似的列连接两个表

问题描述 投票:0回答:1

我有一个销售记录表,如下所示:

姓名 项目 行动 价格 Num_Items
苹果 购买 5.00 10
苹果 出售 6.00 12
面包 出售 9.00 9
鲍勃 苹果 购买 5.00 14
鲍勃 购买 1.00 10
鲍勃 购买 1.00 1
鲍勃 出售 2.00 2
sales_data: ([] Name: `Ann`Ann`Ann`Bob`Bob`Bob`Bob; Item: `Apple`Apple`Bread`Apple`Salt`Salt`Salt; Action: `Buy`Sell`Sell`Buy`Buy`Buy`Sell; Price: 5.00 6.00 9.00 5.00 1.00 1.00 2.00; Num_Items: 10 12 9 14 10 1 2)

输出是具有 >=1 买入和卖出的名称-物品对:

姓名 项目
苹果
鲍勃
distinct_data: ([] Name: `Ann`Bob; Item: `Apple`Salt)

然后我想根据 sales_data 将数据添加到distinct_data 表中,如下所示:

姓名 项目 购买数量 售出数量 加权平均购买价格 加权平均销售价格
苹果 10 12 5 6
鲍勃 11 2 1 2

我如何连接 sales_data 和distinct_data 表才能做到这一点?这是内连接的情况吗?

join kdb
1个回答
0
投票

首先,您可以使用类似于 Terry 在上一个问题中给出的命令生成不同的数据,包括所有列:

q)data:select from sales_data where({all`Buy`Sell in x};Action)fby([]Name;Item)
Name Item  Action Price Num_Items
---------------------------------
Ann  Apple Buy    5     10
Ann  Apple Sell   6     12
Bob  Salt  Buy    1     10
Bob  Salt  Buy    1     1
Bob  Salt  Sell   2     2

然后您可以根据需要聚合数据:

q)agg:select sum Num_Items, Num_Items wavg Price by Name,Item,Action from data
Name Item  Action| Num_Items Price
-----------------| ---------------
Ann  Apple Buy   | 10        5
Ann  Apple Sell  | 12        6
Bob  Salt  Buy   | 11        1
Bob  Salt  Sell  | 2         2

并旋转以获得所需的输出。为了保持简单,我将创建 2 个数据透视表。

q)vol:`Name`Item`Num_Buy`Num_Sold xcol exec P#(Action!Num_Items) by Name,Item from agg
Name Item | Num_Buy Num_Sold
----------| ----------------
Ann  Apple| 10      12
Bob  Salt | 11      2

q)wag:`Name`Item`Weighted_Avg_Price_Bought`Weighted_Avg_Price_Sold xcol exec P#(Action!Price) by Name,Item from agg
Name Item | Weighted_Avg_Price_Bought Weighted_Avg_Price_Sold
----------| -------------------------------------------------
Ann  Apple| 5                         6
Bob  Salt | 1                         2

最后加入他们以给出所需的输出:

q)0!vol uj wag
Name Item  Num_Buy Num_Sold Weighted_Avg_Price_Bought Weighted_Avg_Price_Sold
-----------------------------------------------------------------------------
Ann  Apple 10      12       5                         6
Bob  Salt  11      2        1                         2
© www.soinside.com 2019 - 2024. All rights reserved.