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

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

已结束支持的版本: 6.3
历史版本。 PostgreSQL 6.3 已结束支持。 请参阅 当前版本手册.

第 34 章 扩展 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        |
         +------------+

报告文档问题

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