请考虑以下代码:
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"版本更符合行。
答案 0 :(得分:3)
您的初始查询理想情况下是您对重复列要求的要求。
by
在您的示例中创建列items
的组,并根据从分组items
计算的索引折叠选择查询中的每个其他列。有关by
此处 - http://code.kx.com/wiki/Reference/select和http://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)
简单的update
和update 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