在KDB中复制表列

时间:2018-02-25 20:38:12

标签: kdb

请考虑以下代码:

q)tab:flip `items`sales`prices!(`nut`bolt`cam`cog;6 8 0 3;10 20 15 20)
q)tab
items sales prices
------------------
nut   6     10
bolt  8     20
cam   0     15
cog   3     20

我想复制价格列。我可以这样写一个查询:

q)update prices_copy: prices from tab

我也可以这样写一个查询:

q)select items, sales, prices, prices_copy: first prices by items from tab

两者都有效。我想知道" by"版本将工作和编写每个版本的动机。我不禁想到" by"版本更符合行。

3 个答案:

答案 0 :(得分:3)

您的初始查询理想情况下是您对重复列要求的要求。

by在您的示例中创建列items的组,并根据从分组items计算的索引折叠选择查询中的每个其他列。有关by此处 - http://code.kx.com/wiki/Reference/selecthttp://code.kx.com/wiki/JB:QforMortals2/queries_q_sql#The_by_Phrase

的更多信息

在您的示例中,列items已经是唯一的,因此实际上不会执行折叠到组中,但是,by将从其他列(即列表列表)创建嵌套列表。使用first只会取消嵌套items列,从而将其折叠为普通(长类型)向量。

分组完成后,by列用作结果的键列[s],您将通过使用键列右侧的垂直线来看到这一点[s] ]。 select查询中的所有其他列都放在键的右侧。

答案 1 :(得分:1)

by版本的逻辑巧合地创建了prices的副本。但是by更改了顺序:

q)ungroup select sales, prices by items from tab
items sales prices
------------------
bolt  8     20    
cam   0     15    
cog   3     20    
nut   6     10    

q)tab
items sales prices
------------------
nut   6     10    
bolt  8     20    
cam   0     15    
cog   3     20    

by版本仅适用于items是唯一的。对于具有tab的多个值的item,例如。 8#tab,查询只为prices_copy生成4个值。

q)select items, sales, prices, prices_copy: first prices by items from 8#tab
items| items     sales prices prices_copy
-----| ----------------------------------
bolt | bolt bolt 8 8   20 20  20         
cam  | cam  cam  0 0   15 15  15         
cog  | cog  cog  3 3   20 20  20         
nut  | nut  nut  6 6   10 10  10     

答案 2 :(得分:0)

简单的updateupdate by查询之间有根本的区别。

让我们通过在表中添加额外的列brand来进行探索

tab2:flip `items`sales`prices`brand!(`nut`bolt`cam`cog`nut`bolt`cam`cog;6 8 0 3 1 2 3 4;10 20 15 20 30 40 50 60;`b1`b1`b1`b1`b2`b2`b2`b2)

下面将仅复制列:

asc update prices_copy: prices from tab2

但是,以下查询正在复制first item价格(与品牌无关),并为同一商品的所有其他品牌进行更新。

asc ungroup select sales, prices,brand, prices_copy: first prices by items from tab2
items sales prices brand prices_copy
------------------------------------
bolt  2     40     b2    20
bolt  8     20     b1    20    //b2 price
cam   0     15     b1    15    //b2 price
cam   3     50     b2    15
cog   3     20     b1    20
cog   4     60     b2    20    //b2 price
nut   1     30     b2    10    //b2 price
nut   6     10     b1    10

update by在您要复制商品的max价格的情况下可能有用,而与品牌或其他汇总查询无关。

asc ungroup select sales, prices,brand, prices_copy: max  prices by items from tab2
items sales prices brand prices_copy
------------------------------------
bolt  2     40     b2    40
bolt  8     20     b1    40    //max price in bolts regardless of the brand
cam   0     15     b1    50
cam   3     50     b2    50
cog   3     20     b1    60
cog   4     60     b2    60
nut   1     30     b2    30
nut   6     10     b1    30