CREATE AGGREGATE
CREATE AGGREGATE — 定义一个新的聚集函数
语法
CREATE AGGREGATE name ( BASETYPE = input_data_type
[ , SFUNC1 = sfunc1, STYPE1 = state1_type ]
[ , SFUNC2 = sfunc2, STYPE2 = state2_type ]
[ , FINALFUNC = ffunc ]
[ , INITCOND1 = initial_condition1 ]
[ , INITCOND2 = initial_condition2 ] )
输入
-
name
-
要创建的聚集函数名.
-
input_data_type
-
本聚集函数要处理的基本数据类型.
-
sfunc1
-
用于处理源数据列里的每一个非空(non-NULL)数据的状态转换函数.它必须是一个两个参数的函数,第一个参数的类型是
state1_type
而第二个参数的类型是 input_data_type.此函数必须返回一个类型为
state1_type
的值.这个函数接受当前状态值 1 和当前输入数据条目,而返回下个状态值
1.
-
state1_type
-
聚集的第一个状态值的数据类型.
-
sfunc2
-
用于处理源数据列里的每一个非空(non-NULL)数据的状态转换函数.它是一个单个参数的函数,参数的类型是
state2_type,返回相同的类型.这个函数接受当前状态值
2 和当前输入数据条目,而返回下个状态值 2.
-
state2_type
-
聚集的第二个状态值的类型.
-
ffunc
-
在转换完所有输入域/字段后调用的最终处理函数.如果两个状态值都使用了,最终处理函数必须以两个类型分别为
state1_type
和 state2_type 的数做参数.如果只使用了一个状态值,最终处理函数必须以一个该状态值的类型的数为参数.聚集的输出数据类型被定义为此函数的返回类型.
-
initial_condition1
-
状态值 1 的初始值.
-
initial_condition2
-
状态值 2 的初始值.
命令执行成功的返回信息.
描述
CREATE AGGREGATE 允许用户或程序员通过定义新的聚集函数来扩展
Postgres
的功能.一些用于基本类型的聚集函数如
min(int4) 和
avg(float8)
等已经包含在软件里.如果你需要定义一个新类型或需要一个还没有提供的聚集函数,这时便可用
CREATE
AGGREGATE 来提供我们所需要的特性.
一个聚集函数是用它的名字和输入数据类型来标识的.如果两个聚集的输入数据不同,它们可以有相同的名字.要避免冲突,不要写一个与聚集同名而且输入函数也相同的普通函数.
一个聚集函数是由一到三个普通函数做成的:两个状态转换函数,sfunc1
和 sfunc2,和一个最终计算函数,ffunc.它们是这样使用的:
sfunc1( internal-state1, next-data-item ) ---> next-internal-state1
sfunc2( internal-state2 ) ---> next-internal-state2
ffunc(internal-state1, internal-state2) ---> aggregate-value
Postgres 创建一个或两个临时变量(数据类型是
stype1 和/或
stype2)用于保存被转换函数作为参数的中间结果.对于每个输入数据条目,都调用状态转换函数计算内部状态值的新数值.在处理完所有数据后,调用一次最终处理函数以计算聚集的输出值.
如果两个转换函数都声明了,那么必须声明 ffunc.如果只声明了一个转换函数,那么ffunc
是可选的.在没有提供 ffunc 时的缺省动作是返回所使用的内部状态值的最后的值(因此,聚集的输出类型于状态值的类型相同).
一个聚集函数还可能提供一到两个初始条件,也就是说,所用的该内部状态值的初始值.这些值是做为类型 text
的数据域存储在数据库里的,不过它们必须是状态值数据类型的有效外部表现形式的常量.如果声明了
sfunc1 而没有声明 initcond1 值,那么系统不会对第一个输入条目调用l
sfunc1;取而代之的是,用第一个输入条目初始化内部状态值
1,而从第二个输入条目的开始调用 sfunc1.这样对于象 MIN
和 MAX 这样的函数是很有用的.请注意一个使用这个特性的聚集在没有输入值时将返回
NULL.对状态值 2 没有类似的准备;如果声明了
sfunc2,那么需要一个
initcond2.
注意
使用
DROP AGGREGATE 删除聚集函数.
CREATE AGGREGATE 的参数可以以任何顺序书写,而不只是上面显示的顺序.
声明的聚集函数有可能有各种各样不同的状态和终处理函数组成.比如,count
聚集需要 Ssfunc2 (一个递增函数)但不需要 sfunc1
或 ffunc,而 sum 聚集需要 sfunc1
(一个累加函数)但不需要 sfunc2 或 ffunc
而 avg 聚集需要上面所有状态函数和一个 ffunc (一个除法函数)来计算结果.在任何情况下,至少要定义一个状态函数,而且任何
sfunc2 都有一个对应的 initcond2.
用法
请参考
PostgreSQL 程序员手册 聚集函数章节的聚集函数部分获取完整的例子.
兼容性
SQL92
CREATE AGGREGATE 是
Postgres
语言的扩展.在 SQL92 里没有
CREATE AGGREGATE .