假设我们有下表(称为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