postgresql 自定義聚合函數


基礎數據方法:

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 = '{}'    -- 初始化空數組

);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM