基础数据方法:
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 = '{}' -- 初始化空数组 );
转载于:https://www.cnblogs.com/tiandi/p/10776219.html