2014-05-11 96 views
2

我有一個postgresql表,其中包含多個包含整數的字段(a1,a2,a3等)。postgres中多列的聚合函數

我想跨一個以上的列運行集合函數(平均值,標準差等)。 (其中一些可能有合理數量的空值,所以我不想僅生成列平均值,然後對其進行平均)。

我可以得到一個整數集與

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

,但我再不能得到聚合函數借此作爲輸入。

任何人都可以給我任何提示,我如何才能得到這個工作?

回答

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; 
+0

Spot on - 我錯過了_alias_ - 這就是爲什麼我不斷收到語法錯誤... – sparky

1

您可以定義自己的骨料數組變量:

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

嗯。感謝您的幫助,但我不確定我是否想重新實現所有聚合函數!我似乎有點奇怪,我無法將來自我原始查詢的setof傳遞給現有查詢。 – sparky