基礎數據方法:
CREATE OR REPLACE FUNCTION public.sfun_test1( results numeric[], val numeric) RETURNS numeric[] LANGUAGE 'plpgsql' COST 100 VOLATILE AS $BODY$ BEGIN results :=array_append(results,val); RETURN results; END; $BODY$; ALTER FUNCTION public.sfun_test1(numeric[], numeric) OWNER TO postgres;
最終數據處理方法:
CREATE OR REPLACE FUNCTION public.sffun_test1( results numeric[]) RETURNS numeric LANGUAGE 'plpgsql' COST 100 VOLATILE AS $BODY$ DECLARE ppp integer;--百分位指標 kkk numeric;--序號 sss integer;--序號 ret numeric[];--結果 BEGIN ppp=90;--第90百分位 kkk=1+(array_length(results , 1)-1)*ppp/100::numeric; sss=floor(kkk); ret=array_sort(results,'asc'); RETURN ret[sss]+(ret[sss+1]-ret[sss])*(kkk-sss); END; $BODY$; ALTER FUNCTION public.sffun_test1(numeric[]) OWNER TO postgres;
創建聚合函數
CREATE AGGREGATE agg_test1( BASETYPE = numeric, SFUNC = sfun_test1, STYPE = numeric[], FINALFUNC = sffun_test1 );
查詢數據庫中的聚合函數
SELECT DISTINCT(proname) FROM pg_proc WHERE proisagg order by proname 查所有
SELECT * FROM pg_proc WHERE proname like 'agg%' AND proisagg;查所有agg開頭的
字符串拼接聚合函數:
CREATE AGGREGATE group_concat(anyelement) ( sfunc = array_append, -- 每行的操作函數,將本行append到數組里 stype = anyarray, -- 聚集后返回數組類型 initcond = '{}' -- 初始化空數組 );
