在我的IDE中运行一个手动示例,我正在根据计数和其中一列的总和来选择平均值,如下所示:
SELECT
sum(velocity)/count(*) as avg
from metrics
where repnumber = 397
and material = 1051
and item = 1150
and color = 99;
但是我想根据以上选择更新列repvelocity
。
因此,对于每一行,我希望它选择上面的列,并将repvelocity
设置为平均值
所以我想要
material | item | color | velocity | repnumber | repvelocity
------------------------------------------------------------------------
1 2 2 5 123 4.2
1 2 2 2 123 4.2
1 2 2 5 123 4.2
1 2 2 4 123 4.2
1 2 2 5 123 4.2
2 3 7 7 123 3.8
2 3 7 2 123 3.8
2 3 7 3 123 3.8
2 3 7 2 123 3.8
2 3 7 5 123 3.8
基本上,我有重复的行,因为“速度”列属于客户。因此,每个地方都有代表编号,材质,封面,颜色的组合,我想将代表位置从上方更新为平均值。
您可以看到它查找具有物料1,物料2,颜色2和重复编号123的每一行,对计数/总和取平均值,然后更新每一行的重复速度。
有没有办法像这样进行全表更新?
答案 0 :(得分:2)
您可以使用join
:
update metrics m join
(select repnumber, material, item, color, sum(m2.velocity)/count(*) as avg_velocity
from metrics m2
group by repnumber, material, item, color
) m2
using (repnumber, material, item, color)
set m.repvolocity = m2.avg_velocity;
我也想知道您为什么使用sum(velocity)/count(*)
。我希望avg(velocity)
。两者并非完全相同,只是在velocity
为NULL
的情况下有所不同。
在大多数其他数据库中,您将使用相关子查询:
update metrics m
set repvolocity = (select avg(m2.velocity)
from metrics m2
where m2.repnumber = m.repnumber and m2.material = m.material and m2.item = m.item and m2.color = m.color
);
答案 1 :(得分:-1)
使用avg()函数将是最佳选择 如果您不想使用avg(),可以使用类似的方法。
选择a。,aa.repvelocity 来自指标a 加入 (SELECT SUM(力度)/ COUNT()力度,repnumber 来自指标b 其中b.repnumber = 397 AND b.material = 1051 AND b.item = 1150 AND b.color = 99 GROUP BY b.repnumber)aa 开启aa.repnumber = a.repnumber;
我刚刚使用repnumber进行分组和计算。