CREATE AGGREGATE
CREATE AGGREGATE — 定义一个新的聚合函数
大纲
CREATE AGGREGATEname[ AS ] ( BASETYPE =data_type[ , SFUNC1 =sfunc1, STYPE1 =sfunc1_return_type] [ , SFUNC2 =sfunc2, STYPE2 =sfunc2_return_type] [ , FINALFUNC =ffunc] [ , INITCOND1 =initial_condition1] [ , INITCOND2 =initial_condition2] )
输入
-
name 要创建的聚合函数的名称。
-
data_type 此聚合函数所操作的基本数据类型。
-
sfunc1 会为源列的每个非 NULL 字段调用的状态转移函数。它接受一个类型为
sfunc1_return_type的变量作为第一个参数,并接受该字段作为第二个参数。-
sfunc1_return_type 第一个转移函数的返回类型。
-
sfunc2 会为源列的每个非 NULL 字段调用的状态转移函数。它接受一个类型为
sfunc2_return_type的变量作为唯一参数,并返回同一类型的变量。-
sfunc2_return_type 第二个转移函数的返回类型。
-
ffunc 在遍历完所有输入字段之后调用的最终函数。该函数必须接受两个参数,类型分别为
sfunc1_return_type和sfunc2_return_type。-
initial_condition1 第一个转移函数参数的初始值。
-
initial_condition2 第二个转移函数参数的初始值。
输出
- →
CREATE 命令成功完成时返回的消息。
描述
CREATE AGGREGATE
允许用户或程序员通过定义新的聚合函数来扩展 Postgres
的功能。基本发行版中已经提供了一些针对基本类型的聚合函数,例如min(int4)
和avg(float8)。如果定义了新的类型,或者需要一个尚未提供的聚合函数,就可以使用CREATE AGGREGATE
来提供所需的功能。
一个聚合函数最多可以需要三个函数:两个状态转移函数,sfunc1
和 sfunc2:
sfunc1( internal-state1, next-data_item ) ---> next-internal-state1sfunc2( internal-state2 ) ---> next-internal-state2
以及一个最终计算函数,ffunc:
ffunc(internal-state1, internal-state2) ---> aggregate-value
Postgres 会创建最多两个临时变量(这里称为 temp1
和 temp2),用来保存用作转移函数参数的中间结果。
这些转移函数必须具有下列性质:
sfunc1的参数必须是temp1(类型为sfunc1_return_type)和column_value(类型为data_type)。返回值必须是sfunc1_return_type类型,并将用作下一次调用sfunc1时的第一个参数。sfunc2的参数和返回值必须是temp2(类型为sfunc2_return_type)。最终计算函数的参数必须是
temp1和temp2,而且其返回值必须是 Postgres 的基本类型(不必是为 BASETYPE 指定的data_type)。当且仅当两个状态转移函数都指定时,才应指定 FINALFUNC。
聚合函数还可以需要一个或两个初始条件,每个转移函数一个。它们在数据库中以
text类型的字段的形式指定和存储。
注意
使用DROP AGGREGATE
删除聚合函数。
可以指定具有不同状态函数和最终函数组合的聚合函数。例如,count聚合需要 SFUNC2(一个递增函数)但不需要 SFUNC1 或 FINALFUNC;而 sum聚合需要 SFUNC1(一个加法函数)但不需要 SFUNC2 或 FINALFUNC;而 avg
聚合则需要上述两个状态函数以及一个 FINALFUNC(一个除法函数)来产生它的结果。无论如何,至少要定义一个状态函数,而且任何 SFUNC2 都必须有一个对应的
INITCOND2。
用法
请参阅PostgreSQL 程序员指南中关于聚合函数的章节中关于聚合函数的内容,以获取完整的使用示例。
兼容性
SQL92
CREATE AGGREGATE
是 Postgres 的语言扩展。SQL92 中没有CREATE AGGREGATE。