↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

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 / 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 7.3 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

CREATE AGGREGATE

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

大纲

CREATE AGGREGATE name ( BASETYPE = input_data_type,
    SFUNC = sfunc, STYPE = state_type
    [ , FINALFUNC = ffunc ]
    [ , INITCOND = initial_condition ] )
  

输入

name

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

input_data_type

此聚合函数所操作的输入数据类型。对于不检查其输入值的聚合,可以将其指定为"ANY"(这种聚合的一个例子是count(*))。

sfunc

要为每个输入数据值调用的状态转移函数的名称。它通常是一个双参数函数,第一个参数的类型为state_type,第二个参数的类型为input_data_type。或者,对于不检查其输入值的聚合,该函数只接受一个类型为state_type的参数。无论哪种情况,该函数都必须返回state_type类型的值。此函数接受当前状态值和当前输入数据项,并返回下一个状态值。

state_type

聚合状态值的数据类型。

ffunc

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

initial_condition

状态值的初始设置。这必须是state_type数据类型所接受形式的字面常量。如果未指定,状态值将从 NULL 开始。

输出

CREATE AGGREGATE

命令成功完成时返回的消息。

描述

CREATE AGGREGATE 允许用户或程序员通过定义新的聚合函数来扩展 PostgreSQL 的功能。基本发行版中已经提供了一些针对基本类型的聚合函数,例如min(integer) 和avg(double precision)。如果定义了新的类型,或者需要一个尚未提供的聚合函数,就可以使用CREATE AGGREGATE 来提供所需的功能。

如果给出了一个模式名(例如,CREATE AGGREGATE myschema.myagg ...),则该聚合函数会在指定模式中创建。否则 会在当前模式中创建(即搜索路径最前面的那个模式;见CURRENT_SCHEMA())。

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

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

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

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

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

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

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

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

注意

使用DROP AGGREGATE 删除聚合函数。

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

用法

完整的使用示例请参阅PostgreSQL 程序员指南中关于聚合函数的章节。

兼容性

SQL92

CREATE AGGREGATE 是 PostgreSQL 的语言扩展。 SQL92 中没有CREATE AGGREGATE。

提交更正

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