以下显示的聚合函数默认可用。另外还有两个聚合函数与 JSON SQL 函数 组合在一起。应用程序可以使用 sqlite3_create_function() 接口定义自定义聚合函数。API。
在任何接受单个参数的聚合函数中,该参数之前都可以加上关键字 DISTINCT。在这种情况下,在传递给聚合函数之前会过滤掉重复的元素。例如,函数 "count(distinct X)" 将返回列 X 的不同值的个数,而不是返回列 X 中非 NULL 值的总数。
如果提供 FILTER 子句,则只有 expr 为真的行才包含在聚合中。
如果提供 ORDER BY 子句,则该子句将确定聚合输入的处理顺序。对于像 max() 和 count() 这样的聚合函数,输入顺序并不重要。但是对于 string_agg() 和 json_group_object() 这样的函数,ORDER BY 子句将影响结果。如果未指定 ORDER BY 子句,则聚合的输入将按照任意顺序出现,该顺序可能在每次调用时发生变化。
avg(X)
avg() 函数返回组内所有非 NULL X 的平均值。字符串和 BLOB 值(看起来不像数字)被解释为 0。只要至少有一个非 NULL 输入,无论所有输入是否都是整数,avg() 的结果始终为浮点数。如果没有任何非 NULL 输入,则 avg() 的结果为 NULL。avg() 的结果计算为 total()/count(),因此适用于 total() 的所有约束也适用于 avg()。
count(X)
count(*)
count(X) 函数返回组内 X 不为 NULL 的次数。count(*) 函数(无参数)返回组中的总行数。
group_concat(X)
group_concat(X,Y)
string_agg(X,Y)
group_concat() 函数返回一个字符串,该字符串是所有非 NULL X 值的串联。如果存在参数 Y,则它用作 X 实例之间的分隔符。如果省略 Y,则使用逗号 (",") 作为分隔符。
string_agg(X,Y) 函数是 group_concat(X,Y) 的别名。String_agg() 与 PostgreSQL 和 SQL Server 兼容,而 group_concat() 与 MySQL 兼容。
串联元素的顺序是任意的,除非在最后一个参数之后立即包含 ORDER BY 参数。
max(X)
max() 聚合函数返回组中所有值的最大值。最大值是使用相同列上的 ORDER BY 将返回的最后一个值。仅当组中没有非 NULL 值时,聚合 max() 才会返回 NULL。
min(X)
min() 聚合函数返回组中所有值的最小非 NULL 值。最小值是在对该列进行 ORDER BY 时将出现的第一个非 NULL 值。仅当组中没有非 NULL 值时,聚合 min() 才会返回 NULL。
sum(X)
total(X)
sum() 和 total() 聚合函数返回组中所有非 NULL 值的总和。如果没有任何非 NULL 输入行,则 sum() 返回 NULL,而 total() 返回 0.0。NULL 通常不是对无行总和的有用结果,但 SQL 标准要求它,而且大多数其他 SQL 数据库引擎都以这种方式实现 sum(),因此 SQLite 也以相同的方式实现它以保持兼容性。提供非标准 total() 函数作为解决 SQL 语言中此设计问题的便捷方法。
total() 的结果始终为浮点数。如果所有非 NULL 输入都是整数,则 sum() 的结果为整数值。如果 sum() 的任何输入既不是整数也不是 NULL,则 sum() 返回一个浮点数,它是数学总和的近似值。
如果所有输入都是整数或 NULL,并且在计算过程中发生整数溢出,则 Sum() 将抛出“整数溢出”异常。如果任何先前的输入是浮点数,则不会引发溢出错误。Total() 从不引发整数溢出。
在对浮点数求和时,如果值的幅度相差很大,则由于 IEEE 754 浮点数是近似值,因此结果总和可能不精确。使用 十进制扩展 中的 decimal_sum(X) 聚合来获得浮点数的精确总和。考虑以下测试用例
CREATE TABLE t1(x REAL); INSERT INTO t1 VALUES(1.55e+308),(1.23),(3.2e-16),(-1.23),(-1.55e308); SELECT sum(x), decimal_sum(x) FROM t1;
较大的值 ±1.55e+308 相互抵消,但抵消直到总和结束才会发生,在此期间,较大的 +1.55e+308 淹没了微小的 3.2e-16 值。最终结果是对 sum() 的不精确结果。decimal_sum() 聚合会生成精确的答案,但会消耗额外的 CPU 和内存。还要注意,decimal_sum() 不是内置在 SQLite 核心中的;它是一个 可加载扩展。
如果输入的总和太大而无法表示为 IEEE 754 浮点数,则可能会返回 +Infinity 或 -Infinity 结果。如果使用具有不同符号的非常大的值,以至于 SUM() 或 TOTAL() 函数无法确定正确的结果是 +Infinity 或 -Infinity 还是介于两者之间的其他值,则结果为 NULL。因此,例如,以下查询返回 NULL
WITH t1(x) AS (VALUES(1.0),(-9e+999),(2.0),(+9e+999),(3.0)) SELECT sum(x) FROM t1;
本页最后修改时间:2023-12-05 14:43:20 UTC