【问题标题】:Aggregate functions across multiple columns in postgres在 postgres 中跨多个列聚合函数
【发布时间】:2022-05-13 04:18:33
【问题描述】:

我有一个 postgresql 表,其中包含多个包含整数(a1、a2、a3 等)的字段。

我想一次跨多个列运行聚合函数(平均值、标准差等)。 (其中一些可能有合理数量的空值,所以我不想只生成列平均值然后对它们进行平均)。

我可以得到一组整数

SELECT unnest(array[a1,a2,a3]) as values FROM table

但我无法让聚合函数将此作为输入。

谁能给我任何关于如何让它工作的提示?

【问题讨论】:

    标签: sql postgresql aggregate-functions


    【解决方案1】:

    使用子查询,您可以随意使用所有行:

    SELECT sum(val) FROM (
        SELECT unnest(array[a1,a2,a3]) as val FROM table) alias;
    

    您还可以对行进行分组,例如:

    SELECT field, sum(val) FROM (
        SELECT field, unnest(array[a1,a2,a3]) as val FROM table) alias
    GROUP BY field;
    

    【讨论】:

    • 发现 - 我错过了 alias - 这就是为什么我不断收到语法错误...
    【解决方案2】:

    您可以为数组变量定义自己的聚合:

    CREATE OR REPLACE FUNCTION public.sum_sfunc(double precision, double precision[])
     RETURNS double precision LANGUAGE sql
    AS $function$
      SELECT coalesce($1,0) + sum(v) FROM unnest($2) g(v)
    $function$
    
    CREATE AGGREGATE sum(BASETYPE=double precision[], 
                          SFUNC=sum_sfunc, STYPE=double precision);
    
    postgres=# select * from fo;
     a  │ b  
    ────┼────
     10 │ 20
     30 │ 40
    (2 rows)
    
    postgres=# select sum(array[a,b]) from fo;
     sum 
    ─────
     100
    (1 row)
    

    您可以对其他聚合执行类似的步骤,但 AVG 的实现要困难一些,并且中位数是下一个级别。但一切皆有可能,见http://www.postgresql.org/docs/9.3/static/xaggr.html

    【讨论】:

    • 嗯。感谢您的帮助,但我不确定我是否喜欢重新实现所有聚合函数!我无法将来自原始查询的 setof 传递给现有查询,这似乎有点奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2022-01-06
    相关资源
    最近更新 更多