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_typestate2_type 的数做参数.如果只使用了一个状态值,最终处理函数必须以一个该状态值的类型的数为参数.聚集的输出数据类型被定义为此函数的返回类型.
initial_condition1
状态值 1 的初始值.
initial_condition2
状态值 2 的初始值.

输出

CREATE
命令执行成功的返回信息.

描述

CREATE AGGREGATE 允许用户或程序员通过定义新的聚集函数来扩展 Postgres 的功能.一些用于基本类型的聚集函数如 min(int4)avg(float8) 等已经包含在软件里.如果你需要定义一个新类型或需要一个还没有提供的聚集函数,这时便可用CREATE AGGREGATE 来提供我们所需要的特性.

一个聚集函数是用它的名字和输入数据类型来标识的.如果两个聚集的输入数据不同,它们可以有相同的名字.要避免冲突,不要写一个与聚集同名而且输入函数也相同的普通函数.

一个聚集函数是由一到三个普通函数做成的:两个状态转换函数,sfunc1sfunc2,和一个最终计算函数,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 (一个递增函数)但不需要 sfunc1ffunc,而 sum 聚集需要 sfunc1 (一个累加函数)但不需要 sfunc2ffuncavg 聚集需要上面所有状态函数和一个 ffunc (一个除法函数)来计算结果.在任何情况下,至少要定义一个状态函数,而且任何 sfunc2 都有一个对应的 initcond2

用法

请参考 PostgreSQL 程序员手册 聚集函数章节的聚集函数部分获取完整的例子.
 

兼容性

SQL92

CREATE AGGREGATE 是 Postgres 语言的扩展.在 SQL92 里没有 CREATE AGGREGATE