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

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

第 42 章 扩展 SQL:聚合

Postgres 中的聚合是按照状态转换函数来表示的。也就是说,聚合可以按照每当处理一个实例就被修改的状态来定义。有些状态函数在计算新状态时会查看实例中的特定值(即 create aggregate 语法中的 sfunc1),而另一些只跟踪自己的内部状态( sfunc2)。 如果我们定义一个只使用 sfunc1 的聚合,定义的就是一个对每个实例的属性值计算运行函数的聚合。"Sum" 就是这类聚合的一个例子。"Sum" 从零开始,总是把当前实例的值加到它的运行总和上。我们将使用内置在 Postgres 中的 int4pl 来执行这个加法。

CREATE AGGREGATE complex_sum (
    sfunc1 = complex_add,
    basetype = complex,
    stype1 = complex,
    initcond1 = '(0,0)'
);

SELECT complex_sum(a) FROM test_complex;

         +------------+
         |complex_sum |
         +------------+
         |(34,53.9)   |
         +------------+

如果我们只定义 sfunc2,指定的是一个对每个实例的属性值无关的运行函数计算的聚合。 "Count" 是这类聚合最常见的例子。 "Count" 从零开始,对每个实例向其运行总数加一,忽略实例的值。这里我们使用内置的 int4inc 例程为我们完成这项工作。该例程把输入加一。

CREATE AGGREGATE my_count (
    sfunc2 = int4inc, -- add one
    basetype = int4,
    stype2 = int4,
    initcond2 = '0'
);

SELECT my_count(*) as emp_count from EMP;

         +----------+
         |emp_count |
         +----------+
         |5         |
         +----------+

"Average"(平均值)是一个既需要计算运行总和的函数又需要计算运行计数的函数的聚合例子。处理完所有实例后,聚合的最终答案是运行总和除以运行计数。我们使用前面用过的 int4pl 和 int4inc 例程,以及 Postgres 的整数除法例程 int4div 来计算总和除以计数。

CREATE AGGREGATE my_average (
    sfunc1 = int4pl,     --  sum
    basetype = int4,
    stype1 = int4,
    sfunc2 = int4inc,    -- count
    stype2 = int4,
    finalfunc = int4div, -- division
    initcond1 = '0',
    initcond2 = '0'
);

SELECT my_average(salary) as emp_average FROM EMP;

         +------------+
         |emp_average |
         +------------+
         |1640        |
         +------------+

提交更正

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