↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本。 PostgreSQL 6.4 已结束支持。 请参阅 当前版本手册.

CREATE AGGREGATE

CREATE AGGREGATE — 定义一个新的聚合函数

大纲

CREATE AGGREGATE name [ 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-state1
sfunc2( 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。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.