如何将聚合函数确定的值设置为列

Posted

技术标签:

【中文标题】如何将聚合函数确定的值设置为列【英文标题】:How to set the Value detemined by aggregate function to a column 【发布时间】:2016-06-24 11:41:43 【问题描述】:

我使用 oracle Apex。我创建了一个列 avg 来设置它的值

UPDATE emp 
SET avg = SUM(price) 
OVER (PARTITION BY id)/COUNT(DISTINCT date) OVER(PARTITION BY id);

我已经使用聚合函数成功生成了我想要的值,但我无法将其设置为列。建议我如何将查询结果设置为列。

【问题讨论】:

UPDATE emp SET avg = SUM(price) OVER (PARTITION BY id)/COUNT(DISTINCT date) OVER(PARTITION BY id) AS Price FROM EMP 试过了。我认为我们不应该使用聚合函数来设置语句。但是我不确定 除了SUM(price) / COUNT(DISTINCT date) 看起来很可疑之外,您不应该存储该值。您正在展示可以从现有数据中获得的价值,因此不要创建冗余。 (并且您不应该使用 SQL 单词作为名称,例如 avgdate。) 我在这里替换了 avg 和 date 变量。我想将数据添加到现有表中,这实际上是我的问题。 【参考方案1】:

通过将所有数据放入 CTE 并根据 ID 更新 Emp 表上的数据

假定脚本:

在甲骨文中:

    MERGE INTO EMP U
using (
 SELECT    ID
                , SUM(price) OVER (PARTITION BY id)/COUNT(DISTINCT date) OVER(PARTITION BY id) AS Rnum
        FROM    EMP
) S
on (u.id = s.id)
when matched then update set U.Avg = S.rnum

在 SQL 服务器中

;WITH number AS (
        SELECT    ID
                , SUM(price) OVER (PARTITION BY id)/COUNT(DISTINCT date) OVER(PARTITION BY id) AS Avg
        FROM    EMP

    )
    UPDATE  t 
    SET     t.Avg = r.Avg
    FROM    Emp t
            JOIN number r ON t.ID = r.ID;

【讨论】:

你确定 Oracle 支持吗?

以上是关于如何将聚合函数确定的值设置为列的主要内容,如果未能解决你的问题,请参考以下文章

动态 SQL 透视查询中的分组和聚合函数

在Oracle中按组不使用聚合函数或行到列

如何在 Python 中访问聚合函数的值

聚合函数将多行中的值汇总到一个结果行中

如何在一个值之前的值上计算聚合函数 COUNT(DISTINCT)?

带有子查询的 SQL 多个聚合函数