用户定义的聚集

您可以 CREATE AGGREGATE 语句创建您自己的聚集表达式,然后在您可调用内建的聚集的任何地方调用这些聚集。

下图展示调用用户定义的聚集的语法。
用户定义的聚集
元素 描述 限制 语法
aggregate 要调用的用户定义的聚集的名称 聚集以及为聚集定义的支持函数必须存在 标识符
column table 之内列的名称 必须存在且有数值数据类型 用引号括起的字符串
setup_expr 为特定的调用定制聚集的设置表达式 不可为孤立的主变量。在 setup_expr 中引用的任何列都必须在该查询的 GROUP BY 子句中 表达式
synonym、table、view column 在其中发生的同义词、表或视图 synonym 和它指向的表或视图必须存在 标识符

使用 DISTINCT 或 UNIQUE 关键字来指定仅将用户定义的聚集应用于命名的列或表达式中唯一的值。使用 ALL 关键字来指定将该聚集应用于命名的列或表达式中所有的值。

如果您省略 DISTINCT、UNIQUE 和 ALL 关键字,则缺省值为 ALL。要获取关于 DISTINCT、UNIQUE 和 ALL 关键字的更多信息,请参阅 包括或排除结果集中的重复值

当您指定设置表达式时,将此值传递到 INIT 支持函数,在 CREATE AGGREGATE 语句中为用户定义的聚集定义了该支持函数。

在下列示例中,您将名为 my_avg 的用户定义的聚集应用到 items 表中 quantity 列的所有值:
SELECT my_avg(quantity) FROM items
在下列示例中,您将名为 my_sum 的用户定义的聚集应用于 items 表中 quantity 列的唯一的值。您还支持值 5 作为设置表达式。此值可以指定 my_avg 将计算的总和的初始值为 5
SELECT my_sum(DISTINCT quantity, 5) FROM items
在下列示例中,您将名为 my_max 的用户定义的聚集应用于远程 items 表中 quantity 列的所有值:
SELECT my_max(remote.quantity) FROM rdb@rserv:items remote

如果将 my_max 聚集定义为 EXECUTEANYWHERE,则可将该分布式查询推送到远程数据库服务器 rserv 来执行。如果未将 my_max 聚集定义为 EXECUTEANYWHERE,则该分布式查询扫描远程 items 表,并在本地数据库服务器上计算 my_max 聚集。

您不可以远程数据库服务器的名称来限定用户定义的聚集,如下例所示。在此情况下,数据库服务器返回错误:
SELECT rdb@rserv:my_max(remote.quantity) 
        FROM rdb@rserv:items remote

要获取关于用户定义的聚集的更多信息,请参阅 CREATE AGGREGATE 语句 以及 GBase 8s 用户定义的例程和数据类型开发者指南 中对用户定义的聚集的讨论。

1 请参阅 聚集表达式中有效的表达式的子集