为什么不使用此 SQL 代码查找特定组的平均值?

  • 本文关键字:查找 平均值 代码 SQL sql alter
  • 更新时间 :
  • 英文 :


假设我们有下表(称为numbers(:

Name A B C
Jon  1 3 0.33
Sue  4 4 1
Jon  5 5 1

我想修改这个表,使它包含一个新列D,这是每个人特有的C列的平均值。例如,Jon出现两次,因此它们的C的平均值为0.33 + 1 / 2 = 0.665。因此,我希望将0.665添加到Jon中。同样的原理也适用于数据库中的其他名称,因此结果类似于:

Name A B C    D
Jon  1 3 0.33 0.665
Sue  4 4 1    1
Jon  5 5 1    0.665

有什么办法吗?我试过ALTER TABLE numbers ADD D DECIMAL(50, 2) GENERATED ALWAYS AS AVG(C) GROUP BY Name,但没用。

AVG()是一个跨行工作的聚合函数。生成列的表达式只能在一行内工作,不能跨行工作。

您可以使用视图(或者可能使用用户定义的函数,具体取决于您的数据库(:

create view v_numbers as
select n.*,
avg(c) over (partition by name) as d
from n;

解决方案是窗口函数:

SELECT
name
,a
,b
,c
,avg(c) OVER (PARTITION BY name) AS d
FROM
numbers
;

DB Fiddle

最新更新