选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.3 已于 2018 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

CREATE AGGREGATE

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

大纲

CREATE AGGREGATE name ( input_data_type [ , ... ] ) (
    SFUNC = sfunc,
    STYPE = state_data_type
    [ , FINALFUNC = ffunc ]
    [ , INITCOND = initial_condition ]
    [ , SORTOP = sort_operator ]
)

或者旧语法

CREATE AGGREGATE name (
    BASETYPE = base_type,
    SFUNC = sfunc,
    STYPE = state_data_type
    [ , FINALFUNC = ffunc ]
    [ , INITCOND = initial_condition ]
    [ , SORTOP = sort_operator ]
)

描述

CREATE AGGREGATE定义一个新的聚合函数。一些基本且常用的聚合函数已随发行版提供;它们记录在第 9.20 节中。如果定义了新的类型或者需要一个尚未提供的聚合函数,则可以使用CREATE AGGREGATE来提供所需的功能。

如果给出了一个模式名(例如CREATE AGGREGATE myschema.myagg ...),那么该聚合函数将被创建在指定的模式中。否则它将被创建在当前模式中。

聚合函数由其名称和输入数据类型标识。同一模式中的两个聚合如果操作于不同的输入类型,则可以有相同的名称。聚合的名称和输入数据类型还必须与同一模式中每个普通函数的名称和输入数据类型都不同。

一个聚合函数由一个或两个普通函数构成: 一个状态转移函数sfunc, 以及一个可选的最终计算函数ffunc。 它们的用法如下:

sfunc( internal-state, next-data-values ) ---> next-internal-state
ffunc( internal-state ) ---> aggregate-value

PostgreSQL会创建一个数据类型为stype的临时变量来保存聚合的当前内部状态。对于每一输入行,都会计算聚合参数值,并用当前状态值和新的参数值调用状态转移函数来计算新的内部状态值。处理完所有行之后,会调用一次最终函数来计算聚合的返回值。如果没有最终函数,则结束状态值将按原样返回。

聚合函数可以提供一个初始条件,即内部状态值的初始值。它以text类型值的形式指定并存储在数据库中,但它必须是状态值数据类型常量的有效外部表示形式。如果没有提供它,则状态值初始为空值。

如果状态转移函数被声明为strict的,那么它不能以空值输入被调用。使用这种转移函数时,聚合的执行行为如下:具有任一空值输入的行会被忽略(不调用函数并保留先前的状态值)。如果初始状态值为空,那么在第一个所有输入均非空的行上,第一个参数值会取代状态值,而转移函数会在后续所有输入均非空的行上被调用。这对于实现max这类聚合很方便。注意,只有当state_data_type与第一个input_data_type相同时,此行为才可用。当这两种类型不同时,必须提供非空的初始条件或者使用非严格的转移函数。

如果状态转移函数不是严格的,那么它会在每个输入行被无条件调用,并且必须自行处理空值输入和空值转移值。这使聚合作者能完全控制聚合对空值的处理。

如果最终函数被声明为strict的,那么当结束状态值为空时将不会调用它;而是自动返回空结果。(当然,这只是严格函数的正常行为。)无论如何,最终函数都可以选择返回空值。例如,avg的最终函数在发现输入行数为零时会返回空值。

行为类似MINMAX的聚合有时可以通过查看索引而不是扫描每个输入行来优化。如果此聚合可以如此优化,可以通过指定一个排序操作符来指明。基本要求是该聚合必须产生由该操作符导出的排序顺序中的第一个元素;换句话说:

SELECT agg(col) FROM tab;

必须等效于:

SELECT col FROM tab ORDER BY col USING sortop LIMIT 1;

进一步的假设是聚合忽略空值输入,并且当且仅当没有非空输入时返回空结果。通常,数据类型的<操作符是MIN的正确排序操作符,而>MAX的正确排序操作符。注意,除非指定的操作符是 B-树索引操作符类的小于大于策略成员,否则该优化实际上永远不会生效。

要能创建聚合函数,你必须对参数类型、状态类型和返回类型具有USAGE权限,并对转移函数和最终函数具有EXECUTE权限。

参数

name

要创建的聚合函数的名称(可以用模式限定)。

input_data_type

此聚合函数所操作的一个输入数据类型。要创建一个零参数的聚合函数,可以在输入数据类型列表的位置写*。(这种聚合的一个例子是count(*)。)

base_type

CREATE AGGREGATE的旧语法中,输入数据类型由basetype参数指定,而不是写在聚合名称旁边。注意这种语法只允许一个输入参数。要定义零参数的聚合函数,需将basetype指定为"ANY"(而不是*)。

sfunc

要为每个输入行调用的状态转移函数的名称。对于一个N参数的聚合函数,sfunc必须接受N+1个参数,第一个参数的类型为state_data_type,其余参数与聚合声明的输入数据类型相匹配。该函数必须返回state_data_type类型的值。此函数接受当前状态值和当前输入数据值,并返回下一个状态值。

state_data_type

聚合状态值的数据类型。

ffunc

在遍历完所有输入行之后调用的、用于计算聚合结果的最终函数的名称。该函数必须接受单个类型为state_data_type的参数。聚合的返回数据类型被定义为该函数的返回类型。如果没有指定ffunc,则结束状态值被用作聚合的结果,返回类型为state_data_type

initial_condition

状态值的初始设置。它必须是state_data_type数据类型所接受形式的字符串常量。如果没有指定,状态值初始为空值。

sort_operator

MINMAX聚合的关联排序操作符。这只是一个操作符名称(可以用模式限定)。假定该操作符具有与聚合相同的输入数据类型(聚合必须是单参数聚合)。

CREATE AGGREGATE的参数可以按任意顺序书写,而不只是上面展示的顺序。

示例

第 35.10 节

兼容性

CREATE AGGREGATEPostgreSQL的语言扩展。SQL 标准不提供用户定义的聚合函数。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。