聚合函數
聚合函數用于對一組數據進行匯總計算。本文介紹云原生數據倉庫 AnalyticDB MySQL 版聚合函數的用法與示例。
AnalyticDB for MySQL支持如下聚合函數:
ARBITRARY:隨機返回一組數據中的任意一個值。
AVG:該函數用于計算平均值。
BIT_AND:返回參數所有位按位AND后的結果。
BIT_OR:返回參數所有位按位OR后的結果。
BIT_XOR:返回參數所有位按位異或后的結果。
COUNT:該函數用于計算記錄數。
MAX:該函數用于計算最大值。
MIN:該函數用于計算最小值。
STD、STDDEV或STDDEV_POP:返回數值的總體標準差。
STDDEV_SAMP:返回一組數值(整數、小數或浮點)的樣本標準差。
SUM:該函數用于計算匯總值。
VARIANCE(非標準SQL函數):返回一組數值(整數、小數或浮點)的總體方差。
VAR_POP(標準SQL函數):返回一組數值(整數、小數或浮點)的總體方差。
VAR_SAMP:返回一組數值(整數、小數或浮點)的樣本方差。
GROUP_CONCAT:該函數用于將
GROUP BY
返回結果中屬于同一個分組的值連接起來,返回一個字符串結果。
除GROUP_CONCAT
函數外,本文中的其他聚合函數均以testtable
表為例,建表語句如下:
CREATE TABLE testtable(a INT) DISTRIBUTED BY HASH(a);
已使用如下語句往testtable
表中插入測試數據:
INSERT INTO testtable VALUES (1),(2),(3);
ARBITRARY
arbitrary(x)
命令說明:隨機返回一組數據中的任意一個值。
輸入值類型:支持輸入任意類型的參數。
返回值類型:與該函數的輸入值類型保持一致。
示例:
SELECT arbitrary(a) FROM testtable;
返回結果如下:
+--------------+ | arbitrary(a) | +--------------+ | 2 | +--------------+
AVG
avg(x)
命令說明:該函數用于計算平均值。
輸入值類型:BIGINT、DOUBLE或FLOAT。
返回值類型:DOUBLE。
示例:
SELECT avg(a) FROM testtable;
返回結果如下:
+--------+ | avg(a) | +--------+ | 2.0 | +--------+
BIT_AND
bit_and(x)
命令說明:返回參數所有位按位
AND
后的結果。輸入值類型:BIGINT、DOUBLE或FLOAT。
返回值類型:BIGINT。
示例:
SELECT bit_and(a) FROM testtable;
返回結果如下:
+------------+ | bit_and(a) | +------------+ | 0 | +------------+
BIT_OR
bit_or(x)
命令說明:返回參數所有位按位
OR
后的結果。輸入值類型:BIGINT、DOUBLE或FLOAT。
返回值類型:BIGINT。
示例:
SELECT bit_or(a) FROM testtable;
返回結果如下:
+-----------+ | bit_or(a) | +-----------+ | 3 | +-----------+
BIT_XOR
bit_xor(x)
命令說明:返回參數所有位按位異或后的結果。
輸入值類型:BIGINT、DOUBLE或FLOAT。
返回值類型:BIGINT。
示例:
SELECT bit_xor(a) FROM testtable;
返回結果如下:
+------------+ | bit_xor(a) | +------------+ | 0 | +------------+
COUNT
count([distinct|all] x)
命令說明:該函數用于計算記錄數。
說明distinct
、all
指明在計數時是否去除重復記錄,默認all
,即返回全部記錄。如果指定distinct
,返回結果只計算唯一值數量。輸入值類型:數值、字符串類型或BOOLEAN類型。
返回值類型:BIGINT。
示例:
計算
testtable
中值是唯一的記錄數,語句如下:SELECT count(distinct a) FROM testtable;
返回結果如下:
+-------------------+ | count(distinct a) | +-------------------+ | 3 | +-------------------+
計算
testtable
中所有的記錄數,語句如下:SELECT count(all a) FROM testtable;
返回結果如下:
+--------------+ | count(all a) | +--------------+ | 3 | +--------------+
MAX
max(x)
命令說明:該函數用于計算最大值。
輸入值類型:該函數支持輸入任意類型的參數,但是BOOLEAN類型的數據不允許參與運算。
說明當列中的值為
NULL
時,該行不參與計算。返回值類型:與該函數的輸入值類型保持一致。
示例:
SELECT max(a) FROM testtable;
返回結果如下:
+--------+ | max(a) | +--------+ | 3 | +--------+
MIN
min(value x)
命令說明:該函數用于計算最小值。
輸入值類型:該函數支持輸入任意類型的參數,但是BOOLEAN類型的數據不允許參與運算。
說明當列中的值為
NULL
時,該行不參與計算。返回值類型:與該函數的輸入值類型保持一致。
示例:
SELECT min(a) FROM testtable;
返回結果如下:
+--------+ | min(a) | +--------+ | 1 | +--------+
STD、STDDEV或STDDEV_POP
std(x)
stddev(x)
stddev_pop(x)
命令說明:返回數值的總體標準差。
輸入值類型:BIGINT或DOUBLE。
返回值類型:DOUBLE。
示例:
示例一:
SELECT std(a) FROM testtable;
返回結果如下:
+-------------------+ | std(a) | +-------------------+ | 0.816496580927726 | +-------------------+
示例二:
SELECT stddev_pop(a) FROM testtable;
返回結果如下:
+-------------------+ | stddev_pop(a) | +-------------------+ | 0.816496580927726 | +-------------------+
STDDEV_SAMP
stddev_samp(x)
命令說明:返回一組數值(整數、小數或浮點)的樣本標準差。
輸入值類型:BIGINT或DOUBLE。
返回值類型:DOUBLE。
示例:
SELECT stddev_samp(a) FROM testtable;
返回結果如下:
+----------------+ | stddev_samp(a) | +----------------+ | 1.0 | +----------------+
SUM
sum(x)
命令說明:該函數用于計算匯總值。
輸入值類型:BIGINT、DOUBLE或FLOAT。
返回值類型:BIGINT。
示例:
SELECT sum(a) FROM testtable;
返回結果如下:
+--------+ | sum(a) | +--------+ | 6 | +--------+
VARIANCE
variance(x)
命令說明:返回一組數值(整數、小數或浮點)的總體標準方差。
說明VARIANCE()
會忽略值為NULL的行。因此若一組數值全為NULL,VARIANCE()
會直接返回NULL。VARIANCE()
函數作為標準SQL的延伸,您也可以使用標準SQL函數VAR_POP()
來代替。
輸入值類型:BIGINT或DOUBLE。
返回值類型:DOUBLE。
示例:
SELECT variance(a) FROM testtable; +----------------------------+ | variance(a) | +----------------------------+ | 0.6666666666666666 |
VAR_POP
var_pop(x)
命令說明:返回一組數值
x
(整數、小數或浮點)的總體標準方差。說明VAR_POP()
會忽略值為NULL的行。因此若一組數值全為NULL,VAR_POP()
會直接返回NULL。也可以使用
VARIANCE()
函數,具有相同的意義,但VARIANCE()
不是標準的SQL函數。
輸入值類型:BIGINT或DOUBLE。
返回值類型:DOUBLE。
示例:
SELECT var_pop(a) FROM testtable;
返回結果如下:
+--------------------+ | var_pop(a) | +--------------------+ | 0.6666666666666666 | +--------------------+
VAR_SAMP
var_samp(x)
命令說明:返回一組數值(整數、小數或浮點)的樣本方差。
輸入值類型:BIGINT或DOUBLE。
返回值類型:DOUBLE。
示例:
SELECT var_samp(a) FROM testtable;
返回結果如下:
+-------------+ | var_samp(a) | +-------------+ | 1.0 | +-------------+
GROUP_CONCAT
GROUP_CONCAT([DISTINCT] col_name
[ORDER BY col_name [ASC | DESC]]
[SEPARATOR str_val])
參數 | 是否必填 | 說明 |
| 選填 | 指定需要去重的列。 |
| 指定需要在分組內部進行排序的列,支持如下排序方式:
若未指定排序方式,默認按照升序排序。 | |
| 指定分組內部各值間的分隔符。 若未指定分隔符,默認使用英文逗號(,)分隔。 |
命令說明:該函數用于將
GROUP BY
返回結果中屬于同一個分組的值連接起來,返回一個字符串結果。說明僅當需要使用
GROUP_CONCAT
函數進行連接的列中所有取值均為NULL時,才會輸出NULL
。輸入值類型:字符串。
返回值類型:字符串。
示例
本示例以
person
表為例介紹如何使用GROUP_CONCAT
函數,person
表創建語句如下:CREATE TABLE person(id INT,name VARCHAR,age INT ) DISTRIBUTED BY HASH(id);
使用如下語句往表中插入數據:
INSERT INTO person VALUES (1,'mary',13),(2,'eva',14),(2,'adam',13),(3,'eva',13),(3,null,13),(3,null,null),(4,null,13),(4,null,null);
現需要根據
id
列進行分組,并通過GROUP_CONCAT
函數將ID相同的name
列展示出來,展示結果時需要對name
列去重,并按照name
列進行降序排序,多個name
列間用#
分隔,語句如下:SELECT id, GROUP_CONCAT(DISTINCT name ORDER BY name DESC SEPARATOR '#') FROM person GROUP BY id;
返回結果如下:
+------+--------------------------------------------------------------+ | id | GROUP_CONCAT(DISTINCT name ORDER BY name DESC SEPARATOR '#') | +------+--------------------------------------------------------------+ | 2 | eva#adam | | 1 | mary | | 4 | NULL | | 3 | eva | +------+--------------------------------------------------------------+