我有一个postgresql表,其中包含多个包含整数的字段(a1,a2,a3等)。
我想一次在多个列上运行聚合函数(均值,标准差等)。 (其中一些可能有合理数量的空值,所以我不想只生成列平均值然后平均值。)
我可以用
获得一组整数SELECT unnest(array[a1,a2,a3]) as values FROM table
但是我无法获得聚合函数来将其作为输入。
任何人都可以给我任何关于如何让它发挥作用的提示吗?
答案 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;