聚合函数¶
聚合函数对跨行的值进行操作,以执行总和、平均值、计数、最小值/最大值、标准差和估计值等数学计算,以及执行一些非数学运算。
聚合函数将多行(实际上是零行、一行或多行)作为输入,并生成单个输出。相比之下,标量函数将一行作为输入,并生成一行(一个值)作为输出。
聚合函数始终只返回一行, 即使输入包含零行 也是如此。通常,如果输入包含零行,则输出为 NULL。但是,聚合函数在传递零行时可以返回 0、空字符串或其他一些值。
本主题内容:
函数列表(按子类别)¶
函数名称 |
备注 |
---|---|
一般聚合 |
|
使用与其他聚合函数不同的语法。 |
|
使用与其他聚合函数不同的语法。 |
|
STDDEV 和 STDDEV_SAMP 为别名。 |
|
VAR_POP 的别名。 |
|
VAR_SAMP 的别名。 |
|
按位聚合 |
|
布尔聚合 |
|
哈希 |
|
半结构化数据聚合 |
|
线性回归 |
|
统计与概率 |
|
计算非重复值 |
|
基数估算 . (使用 HyperLogLog) |
|
HLL 的别名。 |
|
非聚合函数;使用来自 HLL_ACCUMULATE 或 HLL_COMBINE 的标量输入。 |
|
相似性估算 . (使用 MinHash) |
|
频率估算 . (使用 Space-Saving) |
|
非聚合函数;使用来自 APPROX_TOP_K_ACCUMULATE 或 APPROX_TOP_K_COMBINE 的标量输入。 |
|
百分位估算 . (使用 T-Digest) |
|
非聚合函数;使用来自 APPROX_PERCENTILE_ACCUMULATE 或 APPROX_PERCENTILE_COMBINE 的标量输入。 |
|
聚合实用程序 |
|
非聚合函数,但可以与聚合函数结合使用,以确定由 GROUP BY 查询生成的行的聚合级别。 |
|
GROUPING 的别名。 |
介绍性示例¶
以下示例说明了聚合函数 (AVG) 和标量函数 (COS) 之间的区别。标量函数为每个输入行返回一个输出行,而聚合函数为多个输入行返回一个输出行:
此表包含以下列数据:
SELECT x, y FROM simple ORDER BY x,y; +----+----+ | X | Y | |----+----| | 10 | 20 | | 20 | 44 | | 30 | 70 | +----+----+标量函数为每个输入行返回一个输出行。
SELECT COS(x) FROM simple ORDER BY x; +---------------+ | COS(X) | |---------------| | -0.8390715291 | | 0.4080820618 | | 0.1542514499 | +---------------+聚合函数为多个输入行返回一个输出行:
SELECT SUM(x) FROM simple; +--------+ | SUM(X) | |--------| | 60 | +--------+
聚合函数和 NULL 值¶
某些聚合函数会忽略 NULL 值。例如,AVG 根据以下公式将 1
、5
和 NULL
值的平均值计算为 3
:
(1 + 5) / 2 = 3
在分子和分母中,仅使用两个非 NULL 值。
如果传递给聚合函数的所有值都是 NULL,则聚合函数返回 NULL。
可以将多个列传递给某些聚合函数。例如:
SELECT COUNT(col1, col2) FROM table1;
在这些实例中,如果任何单个列为 NULL,则聚合函数将忽略某一行。
例如,在以下查询中,COUNT 返回 1
,而不是 4
,因为四行中有三行在所选列中至少包含一个 NULL 值:
创建一个表并用值填充它:
CREATE TABLE t (x INT, y INT); INSERT INTO t (x, y) VALUES (1, 2), -- No NULLs. (3, NULL), -- One but not all columns are NULL. (NULL, 6), -- One but not all columns are NULL. (NULL, NULL); -- All columns are NULL.查询表:
SELECT COUNT(x, y) FROM t; +-------------+ | COUNT(X, Y) | |-------------| | 1 | +-------------+
类似地,如果使用引用两列或多列的表达式调用 SUM,并且如果其中一列或多列是 NULL,则该表达式的计算结果为 NULL,并且忽略该行:
SELECT SUM(x + y) FROM t; +------------+ | SUM(X + Y) | |------------| | 3 | +------------+
请注意,此行为与 GROUP BY 的行为不同,后者在某些列为 NULL 时不会丢弃行:
SELECT x AS X_COL, y AS Y_COL FROM t GROUP BY x, y; +-------+-------+ | X_COL | Y_COL | |-------+-------| | 1 | 2 | | 3 | NULL | | NULL | 6 | | NULL | NULL | +-------+-------+