暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

2016-11-03-PostgreSQL之自定义聚合函数

原创 xiao_mini 2024-01-20
264

参考

CREATEAGGREGATE

实例

测试表

drop table if exists test cascade; create table test( id bigint, name text );

测试数据

insert into test values(1,'my'), (1,'name'), (1,'is'), (1,'pt');

状态转换函数

/* --参数说明: --pre 上一次被调用后生成的计算结果 --curr_str 本次待处理的记录 */ create or replace function my_str_conn2(pre text,curr_str text) returns text as $$ select case when coalesce($2,'0') = '0' then $1 else $1 || ' ' || $2 end; $$ language sql immutable;

最终处理函数[可选] 对sfunc函数的输出结果做最后的加工

create or replace function my_str_conn2_final(text) returns text as $$ select trim(replace($1,'init,','')); $$ language sql;

聚合函数

drop aggregate my_str_conn_cnt2(text); create aggregate my_str_conn_cnt2(text)( sfunc=my_str_conn2, --聚合运算的逻辑主体 stype=text, --聚集的状态值的数据类型 finalfunc=my_str_conn2_final, --负责最终加工步骤的函数 initcond='init' --状态值的初始设置 )

验证

select id ,my_str_conn_cnt2(name) from test group by id;

Example

状态转换函数

--prev记录上一次 计算结果的作为本次输入 --curr_need是本次待处理记录 create or replace function my_sum(prev bigint[2],curr_need bigint) returns bigint[] as $$ select case when $2 is null or $2=0 then $1 else array[coalesce($1[1],0),$1[2]+$2] end;         $$ language sql immutable;

最终处理函数[可选] 对sfunc函数的输出结果做最后的加工

create or replace function my_sum_final(prev bigint[]) returns bigint as $$ select ($1[1]+$1[2]); $$ language sql immutable;

聚合函数

create aggregate my_sum_cnt(bigint)( sfunc =my_sum, -- stype =bigint[], -- The data type for the aggregate state value. finalfunc=my_sum_final, -- initcond ='{0,0}' -- The initial setting for the state value );

验证

create table a( id int); insert into a select generate_series(1,100); select my_sum_cnt(id::bigint),sum(id) from a
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论