我有一個postgresql表,其中包含多個包含整數的字段(a1,a2,a3等)。postgres中多列的聚合函數
我想跨一個以上的列運行集合函數(平均值,標準差等)。 (其中一些可能有合理數量的空值,所以我不想僅生成列平均值,然後對其進行平均)。
我可以得到一個整數集與
SELECT unnest(array[a1,a2,a3]) as values FROM table
,但我再不能得到聚合函數借此作爲輸入。
任何人都可以給我任何提示,我如何才能得到這個工作?
我有一個postgresql表,其中包含多個包含整數的字段(a1,a2,a3等)。postgres中多列的聚合函數
我想跨一個以上的列運行集合函數(平均值,標準差等)。 (其中一些可能有合理數量的空值,所以我不想僅生成列平均值,然後對其進行平均)。
我可以得到一個整數集與
SELECT unnest(array[a1,a2,a3]) as values FROM table
,但我再不能得到聚合函數借此作爲輸入。
任何人都可以給我任何提示,我如何才能得到這個工作?
你所擁有的所有行在您的處置的子查詢:
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;
您可以定義自己的骨料數組變量:
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傳遞給現有查詢。 – sparky
Spot on - 我錯過了_alias_ - 這就是爲什麼我不斷收到語法錯誤... – sparky