聚集函数从一个输入值的集合计算出一个单一值。 内建的通用聚集函数在Table 10.56中列出,而统计性聚集是在Table 10.57中列出。 内建的组内有序集聚集函数在Table 10.58中列出,而内建的组内假想集聚集在Table 10.59中列出。 与聚集函数紧密相关的分组操作在Table 10.60中列出。 Section 5.2.7中会解释针对聚集函数的特殊语法考虑。额外的介绍信息请参考Section 2.7。
支持部分模式的聚合函数具备参与各种优化的条件,例如并行聚合。
Table 10.56. 通用聚集函数
函数 描述 | 部分模式 |
---|---|
将所有输入值,包括空值,收集到一个数组中。 | No |
将所有输入数组连接到一个更高维度的数组中。(输入必须都具有相同的维度,并且不能为空的(empty)或空值(null)。) | No |
计算所有非空输入值的平均值(算术平均值)。 | Yes |
计算所有非空输入值的逐位AND。 | Yes |
计算所有非空输入值的逐位OR。 | Yes |
如果全部非空输入值都为真则返回真,否则返回假。 | Yes |
如果任何非空输入值为真则返回真,否则返回假。 | Yes |
计算输入行的数量。 | Yes |
计算输入值不为空的输入行的数量。 | Yes |
这是对应 | Yes |
收集所有输入值,包括空值,到一个JSON数组。根据 | No |
将所有键/值对收集到一个JSON对象中。关键参数强制转换为文本;值参数按照 | No |
计算非空输入值的最大值。适用于任何数字、字符串、日期/时间或enum类型,
以及 | Yes |
计算非空输入值的最小值。可用于任何数字、字符串、日期/时间或enum类型,
以及 | Yes |
连接非空输入值到字符串中。第一个值之后的每个值前面都有相应的 | No |
计算非空输入值的总和。 | Yes |
连接非空的XML输入值(参见Section 10.15.1.7)。 | No |
应该注意的是,除了count
之外,这些函数在没有选择行时返回空值。
特别地,行数的sum
返回空(null),而不是预期的零,array_agg
在没有输入行时返回空(null)而不是空数组。
coalesce
函数可以在必要时用零或空数组代替空(null)。
聚合函数 array_agg
,json_agg
, jsonb_agg
,json_object_agg
, jsonb_object_agg
,
string_agg
,和 xmlagg
,以及类似的用户定义的聚合函数,根据输入值的顺序产生富有意义的不同的结果值。
默认情况下,这种排序是不指定的,但可以通过在聚合调用中写入ORDER BY
子句来控制,如Section 5.2.7所示。
或者,从排序的子查询提供输入值通常也可以。例如:
SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;
注意,如果外部查询级别包含其他处理,例如关联,则此方法可能会失败,因为这可能导致子查询的输出在计算聚合之前重新排序。
布尔聚合 bool_and
和 bool_or
对应于标准SQL聚合 every
和 any
或 some
.
LightDB 支持 every
, 但不支持 any
或 some
, 因为标准语法中存在模糊性:
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
这里ANY
可以被认为是引入子查询,或者是聚合函数,如果子查询返回一行布尔值。因此,不能为这些聚合提供标准名称。
习惯使用其他SQL数据库管理系统的用户可能会对count
聚合应用于整个表时的性能感到失望。一个类似下面的查询:
SELECT count(*) FROM sometable;
将需要与表大小成比例的工作:LightDB将需要扫描整个表或包含表中所有行的索引。
当您使用 SharedJDBC 框架时,它可能会解析聚合函数的参数名。但是,默认情况下,LightDB 输出函数调用列名没有参数。
select max(a) from agg_table; max ----- 10 (1 row)
如果您遇到了这个问题,可以打开开关 lightdb_aggcolumn_rename
。当打开这个开关时,当您使用列引用调用 count、avg、min、max、sum
时,LightDB 将输出带有参数列表的列名。
set lightdb_aggcolumn_rename=on; select max(a) from agg_table; MAX(A) -------- 10 (1 row)
这种重命名仅适用于简单的列引用,而不适用于函数调用、表达式等情况。
set lightdb_aggcolumn_rename=on; select max(a + 1) from agg_table; max ----- 11 (1 row)
Table 10.57显示了统计分析中常用的聚合函数。
(这些被分离出来仅仅是为了避免使更常用的聚合列表混乱。)
显示为接受numeric_type
的函数可用于所有类型smallint
, integer
,bigint
, numeric
, real
, 和 double precision
。
在描述中提及N
时,它意味着所有输入表达式都非空的输入行数。在所有情况下,如果计算没有意义,则返回null,例如当N
为0时。
Table 10.57. 用于统计的聚集函数
Table 10.58显示了一些使用ordered-set aggregate语法的聚合函数。
这些函数有时被称为“inverse distribution”函数。
它们的聚合输入是通过ORDER BY
引入的,它们还可以接受未聚合的direct argument,但只计算一次。
所有这些函数在其聚合的输入中都忽略空(null)值。
对于使用fraction(fraction)
参数的函数,分数值必须在0到1之间;否则将抛出一个错误。但是,空分数
值简单地产生一个空结果。
Table 10.58. 有序集聚集函数
列在Table 10.59中的每个“hypothetical-set”聚合都与Section 10.22中定义的同名窗口函数相关联。
在每种情况下,聚合的结果都是相关的窗口函数将为由args
构造的“hypothetical”行返回的值,如果将这样的行添加到sorted_args
表示的已排序行组中。
对于这些函数中的每一个,args
中给出的直接参数列表必须与sorted_args
中给出的聚合参数的数量和类型匹配。
与大多数内置聚合不同,这些聚合不是严格的,也就是说它们不会删除包含空值的输入行。空值根据ORDER BY
子句中指定的规则排序。
Table 10.59. 假想集聚集函数
Table 10.60. 分组操作
Table 10.60所示的分组操作与分组集(参见Section 8.2.4)共同使用,以区分结果行。
GROUPING
函数的参数实际上并不求值,但它们必须与相关查询级别的GROUP BY
子句中给出的表达式完全匹配。例如:
=>
SELECT * FROM items_sold;
make | model | sales -------+-------+------- Foo | GT | 10 Foo | Tour | 20 Bar | City | 15 Bar | Sport | 5 (4 rows)=>
SELECT make, model, GROUPING(make,model), sum(sales) FROM items_sold GROUP BY ROLLUP(make,model);
make | model | grouping | sum -------+-------+----------+----- Foo | GT | 0 | 10 Foo | Tour | 0 | 20 Bar | City | 0 | 15 Bar | Sport | 0 | 5 Foo | | 1 | 30 Bar | | 1 | 20 | | 3 | 50 (7 rows)
在这里,前四行中的grouping
值0
表明这些已经正常分组,在两个分组列上。
值1
表示model
没有在倒数两行中分组,值3
表示无论是make
还是model
都没有在最后一行中分组(因此,这是所有输入行的聚合)。