方法1
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;
方法2:
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 );