Man page - create_aggregate(7)

Manual

CREATE AGGREGATE

NAME
SYNOPSIS
DESCRIPTION 描 述
PARAMETERS 参 数
EXAMPLES 例 子
COMPATIBILITY 兼 容 性
SEE ALSO 参 见
译 者


NAME

CREATE AGGREGATE - 定 义 一 个 新 的 聚 集 函 数

SYNOPSIS

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

DESCRIPTION 描 述

CREATE AGGREGATE 定 义 一 个 新 的 聚 集 函 数 。 一 些 用 于 基 本 类 型 的 聚 集 函 数 如 min(integer) 和 avg(double precision) 等 已 经 包 含 在 基 础 软 件 包 里 了 。 如 果 你 需 要 定 义 一 个 新 类 型 或 需 要 一 个 还 没 有 提 供 的 聚 集 函 数 , 这 时 便 可 用 CREATE AGGREGATE 来 提 供 我 们 所 需 要 的 特 性 。

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

一 个 聚 集 函 数 是 用 它 的 名 字 和 输 入 数 据 类 型 来 标 识 的 。 同 一 模 式 中 如 果 两 个 聚 集 处 理 的 输 入 数 据 不 同 , 它 们 可 以 有 相 同 的 名 字 。 一 个 聚 集 函 数 的 输 入 数 据 类 型 必 须 和 所 有 同 一 模 式 中 的 普 通 函 数 的 名 字 和 输 入 类 型 不 同 。

一 个 聚 集 函 数 是 用 一 个 或 两 个 普 通 函 数 做 成 的 : 一 个 状 态 转 换 函 数 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 的 初 始 条 件 或 者 使 用 一 个 非 strice的 状 态 转 换 函 数 。

如 果 状 态 转 换 函 数 不 是 strict( 严 格 ) 的 , 那 么 它 将 无 条 件 地 为 每 个 输 入 值 调 用 , 并 且 必 须 自 行 处 理 NULL 输 入 和 NULL 转 换 值 , 这 样 就 允 许 聚 集 的 作 者 对 聚 集 中 的 空 值 有 完 全 的 控 制 。

如 果 终 转 换 函 数 定 义 为 "strict", 则 如 果 最 终 状 态 值 是 NULL 时 就 不 会 调 用 它 ; 而 是 自 动 输 出 一 个 NULL的 结 果 。 ( 当 然 , 这 才 是 strict 函 数 的 正 常 特 征 。 ) 不 管 是 那 种 情 况 , 终 处 理 函 数 可 以 选 择 返 回 NULL。 比 如 , avg 的 终 处 理 函 数 在 零 输 入 记 录 时 就 会 返 回 NULL。

PARAMETERS 参 数

name

要 创 建 的 聚 集 函 数 名 ( 可 以 有 模 式 修 饰 的 ) 。

input_data_type

本 聚 集 函 数 要 处 理 的 基 本 数 据 类 型 。 对 于 不 检 查 输 入 类 型 的 聚 集 来 说 , 这 个 参 数 可 以 声 明 为 "ANY"。 ( 比 如 count(*)) 。

sfunc

用 于 处 理 源 数 据 列 里 的 每 一 个 输 入 数 据 的 状 态 转 换 函 数 名 称 。 它 通 常 是 一 个 双 参 数 的 函 数 , 第 一 个 参 数 的 类 型 是 state_data_type 而 第 二 个 参 数 的 类 型 是 input_data_type. 另 外 , 对 于 一 个 不 检 查 输 入 数 据 的 聚 集 , 该 函 数 只 接 受 一 个 类 型 为 state_data_type 的 参 数 。 不 管 是 哪 种 情 况 , 此 函 数 必 须 返 回 一 个 类 型 为 state_data_type的 值 。 这 个 函 数 接 受 当 前 状 态 值 和 当 前 输 入 数 据 条 目 , 而 返 回 下 个 状 态 值 。

state_data_type

聚 集 的 状 态 值 的 数 据 类 型 。

ffunc

在 转 换 完 所 有 输 入 域 /字 段 后 调 用 的 最 终 处 理 函 数 。 它 计 算 聚 集 的 结 果 。 此 函 数 必 须 接 受 一 个 类 型 为 state_data_type 的 参 数 。 聚 集 的 输 出 数 据 类 型 被 定 义 为 此 函 数 的 返 回 类 型 。 如 果 没 有 声 明 ffunc 则 使 用 聚 集 结 果 的 状 态 值 作 为 聚 集 的 结 果 , 而 输 出 类 型 为 state_data_type。

initial_condition

状 态 值 的 初 始 设 置 ( 值 ) 。 它 必 须 是 一 个 数 据 类 型 state_data_type 可 以 接 受 的 文 本 常 量 值 。 如 果 没 有 声 明 , 状 态 值 初 始 为 NULL。

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

EXAMPLES 例 子

参 阅 ‘‘User-defined Aggregates’’

COMPATIBILITY 兼 容 性

CREATE AGGREGATE 是 PostgreSQL 语 言 的 扩 展 。 在 SQL 标 准 里 没 有 CREATE AGGREGATE。

SEE ALSO 参 见

ALTER AGGREGATE [ alter_aggregate (7)], DROP AGGREGATE [ drop_aggregate (l)]

译 者

Postgresql 中 文 网 站 何 伟 平 <laser@pgsqldb.org>

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。
中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh