在postgres中跨多个列聚合函数

时间:2014-05-11 18:44:24

标签: sql postgresql

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

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

我可以用

获得一组整数
SELECT unnest(array[a1,a2,a3]) as values FROM table

但是我无法获得聚合函数来将其作为输入。

任何人都可以给我任何关于如何让它发挥作用的提示吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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;