KingbaseES自定义聚集函数

KingbaseES自定义聚集函数

聚集函数对表的多行数据进行计算,得到一个计算结果。比如:count,sum,max等。这些是数据库自带的聚集函数。KES中的聚集函数是根据状态值和状态转换函数(sfunc)定义的。也就是说,聚集使用状态值进行操作,该状态值随着每个连续输入行进行迭代处理。要定义新的聚集函数,可以为状态值选择一种数据类型,即初始值状态的值和状态转换函数。状态转换函数采用以前的状态值和当前行的输入值进行聚集操作,并返回一个新的状态值。如果聚合的期望结果与需要保持在运行状态值中的数据不同,也可以指定最终函数(ffunc)。最终函数获取结束状态值,并返回所需的任何结果作为聚合结果。原则上,转换函数和最终函数只是普通函数,也可以在聚合上下文之外使用。

除了聚合的用户看到的参数和结果数据类型之外,还有一种内部状态值数据类型可能与参数和结果类型不同。如果我们定义了一个不使用最终函数(ffunc)的聚合,那么我们就有了一个聚合,它使用转换函数计算每行中列值的聚集。如果初始状态值为null,并且转换函数标记为“strict”,KES当遇到输入值为null时不会调用对null值调用转换函数进行聚集操作

如果系统自带的聚集函数不能满足处理要求,则需要创建自定义的聚集函数。根据以上对聚集函数的介绍,我们可以知道创建自定义聚集函数就是要实现聚集函数的转换函数(sfunc)和最终函数(ffunc)(可选),定义状态值的数据类型及中间值的初始值(可选)四个部分。创建自定义聚集函数语法如下(部分):

CREATE AGGREGATE name ( [ argmode ] [ argname ] arg_data_type

[ , ... ] ) (

SFUNC = sfunc,    //指定转换函数

STYPE = state_data_type      //中间值数据类型

 [ , FINALFUNC = ffunc ]    //指定最终函数

 [ , INITCOND = initial_condition ]    //设置中间值的初始值

)

以下以创建自定义聚集函数dj_concat为例,说明KES创建自定义聚集函数具体的操作:

dj_concat函数对表agg的a列数据做concat操作,结果返回clob数据类型。测试数据:

create table agg(a varchar(50);

insert into agg values(‘a’),(‘b’),(‘c’),(null)

  • 创建转换函数(sfunc)

转换函数的作用就是对表中满足条件的行中的列值做自定义的聚集操作,本例中是对agg表的a列做concat操作。对表中满足条件的行的列值操作的迭代调用由数据库自动完成

create function s_wm_concat(varchar,varchar) returns varchar

as

begin

return $1||$2;

end;

language plpgsql;

  • 创建最终函数(ffunc)

最终函数在所有行的数据都迭代执行完成后,只执行一次。本例中的最终函数做varchar到clob的数据类型转换

create function f_wm_concat(varchar) returns clob

as

$$

begin

return $1::clob;

end;

$$

language plpgsql;

  • 创建自定义聚集函数

创建自定义聚集函数,指定聚集操作需要调用的转换函数和最终函数

CREATE AGGREGATE dj_concat(varchar)

(

sfunc = s_wm_concat, //指定转换函数是s_wm_concat

stype = varchar,     //指定中间值的数据类型

finalfunc = f_wm_concat,    //指定最终函数是f_wm_concat

INITCOND=''   //指定中间值的初始值

);

  • 测试

KingbaseES自定义聚集函数_第1张图片

你可能感兴趣的:(oracle,数据库)