为什么没有找到使用此 SQL 代码工作的特定组的平均值?

问题描述

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