问题描述
假设我们有下表(名为 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
;