聚合函数
聚合函数对一组值进行计算,并返回单个的值。除了COUNT(*)外,聚合函数都会忽略NULL值。聚合函数通常与GOURP BY子句同时使用。
AVG
AVG([ALL | DISTINCT] expr)
描述:返回输入expr的平均值,NULL值将被忽略。
参数类型:可以是TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、DECIMAL、FLOAT、DOUBLE。
返回值类型:
- 返回值类型视入参数据类型而定。当入参为精确值(INT、DECIMAL)时,返回DECIMAL;当入参为近似值(FLOAT、DOUBLE)时返回DOUBLE类型。
- 如果expr中的值均为NULL,则AVG()返回NULL。
- 如果指定ALL或者不指定ALL与DISTINCT,则返回expr中所有非空值的平均值。
- 如果指定DISTINCT,则返回expr中不同值的平均值。
示例:
m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age); CREATE TABLE m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL); INSERT 0 6 m_db=# SELECT * FROM m_test; age | salary -----+-------- 1 | 1 | 1 1 | 2 1 | 2 2 | 2 | (6 rows) m_db=# SELECT age, AVG(salary) FROM m_test GROUP BY (age); age | avg -----+-------- 1 | 1.6667 2 | (2 rows) m_db=# SELECT age, AVG(DISTINCT salary) FROM m_test GROUP BY (age); age | avg -----+-------- 1 | 1.5000 2 | (2 rows) m_db=# DROP TABLE m_test; DROP TABLE
BIT_AND
BIT_AND([ALL] expr)
描述:返回expr中所有值的按位与,NULL值将被忽略。
参数类型:BIT_AND需要使用BIGINT作为参数,其他类型的参数会被转换为BIGINT,并且可能发生截断。
返回值类型:
- 返回值类型为BIGINT。
- 如果expr中的值均为NULL,则BIT_AND()返回一个中性值(所有位都被设置为1)。
- ALL为可选项,不影响结果。
示例:
m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age);
CREATE TABLE
m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL);
INSERT 0 6
m_db=# SELECT * FROM m_test;
age | salary
-----+--------
1 |
1 | 1
1 | 2
1 | 2
2 |
2 |
(6 rows)
m_db=# SELECT BIT_AND(ALL salary) FROM m_test GROUP BY age;
bit_and
----------------------
18446744073709551615
0
(2 rows)
m_db=# DROP TABLE m_test;
DROP TABLE
BIT_OR
BIT_OR([ALL] expr)
描述:返回expr中所有值的按位或,NULL值将被忽略。
参数类型:BIT_OR需要使用BIGINT作为参数,其他类型的参数会被转换为BIGINT,并且可能发生截断。
返回值类型:
- 返回值类型为BIGINT。
- 如果expr中的值均为NULL,则BIT_OR()返回一个中性值(所有位都被设置为0)。
- ALL为可选项,不影响结果。
示例:
m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age); CREATE TABLE m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL); INSERT 0 6 m_db=# SELECT * FROM m_test; age | salary -----+-------- 1 | 1 | 1 1 | 2 1 | 2 2 | 2 | (6 rows) m_db=# SELECT BIT_OR(ALL salary) FROM m_test GROUP BY age; bit_or -------- 0 3 (2 rows) m_db=# DROP TABLE m_test; DROP TABLE
BIT_XOR
BIT_XOR([ALL] expr)
描述:返回expr中所有值的按位异或,NULL值将被忽略。
参数类型:BIT_XOR需要使用BIGINT作为参数,其他类型的参数会被转换为BIGINT,并且可能发生截断。
返回值类型:
- 返回值类型为BIGINT。
- 如果expr中的值均为NULL,则BIT_OR()返回一个中性值(所有位都被设置为0)。
- ALL为可选项,不影响结果。
示例:
m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age); CREATE TABLE m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL); INSERT 0 6 m_db=# SELECT * FROM m_test; age | salary -----+-------- 1 | 1 | 1 1 | 2 1 | 2 2 | 2 | (6 rows) m_db=# SELECT BIT_XOR(ALL salary) FROM m_test GROUP BY age; bit_xor --------- 0 1 (2 rows) m_db=# DROP TABLE m_test; DROP TABLE
COUNT
- COUNT([ALL] expr)
参数类型:入参可以是任意类型。
返回值类型:
- 返回值类型为BIGINT。
- 如果expr中的值均为NULL,则COUNT()返回0。
- ALL为可选项,不影响结果。
- COUNT(*)比较特殊,它返回expr中所有值的数量,无论其是否为NULL。
示例:
m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age); CREATE TABLE m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL); INSERT 0 6 m_db=# SELECT * FROM m_test; age | salary -----+-------- 1 | 1 | 1 1 | 2 1 | 2 2 | 2 | (6 rows) m_db=# SELECT COUNT(ALL salary) FROM m_test GROUP BY age; count ------- 3 0 (2 rows) m_db=# SELECT COUNT(*) FROM m_test GROUP BY age; count ------- 4 2 (2 rows) m_db=# DROP TABLE m_test; DROP TABLE
- COUNT(DISTINCT expr1 [, expr2, ..., exprN] )
参数类型:入参可以是任意类型。
返回值类型:
- 返回值类型为BIGINT。
- 如果expr中的值均为NULL,则返回0。
示例:
m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age); CREATE TABLE m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL); INSERT 0 6 m_db=# SELECT * FROM m_test; age | salary -----+-------- 1 | 1 | 1 1 | 2 1 | 2 2 | 2 | (6 rows) m_db=# SELECT COUNT(DISTINCT salary) FROM m_test GROUP BY age; count ------- 2 0 (2 rows) m_db=# DROP TABLE m_test; DROP TABLE
GROUP_CONCAT
GROUP_CONCAT语法如下:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
描述:将expr中的各个值进行拼接,返回一个字符串结果,NULL值会被忽略。
- 指定DISTINCT时消除expr中的重复值。
- ORDER BY:通过指定列对expr中的值进行排序。
- ASC | DESC:ASC为升序排序,DESC为倒序排序,默认为升序排序。
- SEPARATOR:拼接字符串时使用的分隔符,默认为逗号(,)。
- 当同时指定DISTINCT和ORDER BY时,DISTINCT表达式必须包含ORDER BY表达式,否则会报错。
- GROUP_CONCAT(... ORDER BY 数字)不代表按照第几个参数的顺序,数字只是一个常量表达式,相当于不排序。
- 使用参数group_concat_max_len限制GROUP_CONCAT最大返回长度,超长截断,目前能返回的最大长度是1073741823。
返回值类型:TEXT
示例:
m_db=# CREATE TABLE m_test(id INT, name CHAR) DISTRIBUTE BY HASH(id); CREATE TABLE m_db=# INSERT INTO m_test VALUES (1, 'a'), (1, 'b'), (2, 'd'), (2, 'c'), (3, 'a'), (3, NULL); INSERT 0 6 m_db=# SELECT * FROM m_test; id | name ----+------ 1 | a 1 | b 2 | d 2 | c 3 | a 3 | (6 rows) m_db=# SELECT GROUP_CONCAT(name SEPARATOR '') FROM m_test; group_concat -------------- abdca (1 row) m_db=# SELECT GROUP_CONCAT(DISTINCT id, name ORDER BY id DESC) FROM m_test; group_concat ------------------ 3a,2c,2d,1a,1b (1 row) m_db=# DROP TABLE m_test; DROP TABLE
MAX
MAX([ALL | DISTINCT] expr)
描述:返回输入expr的最大值,NULL值将被忽略。
参数类型:任意数值、字符串、日期时间类型。
返回值类型:
- 返回值类型与参数数据类型相同。
- 如果expr中的值均为NULL,则MAX()返回NULL。
- 如果指定ALL或者不指定ALL与DISTINCT,则返回expr中所有非空值的最大值。
- 如果指定了DISTINCT,则返回expr中不同非空值的最大值,与不指定DISTINCT的结果相同。
示例:
m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age); CREATE TABLE m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL); INSERT 0 6 m_db=# SELECT * FROM m_test; age | salary -----+-------- 1 | 1 | 1 1 | 2 1 | 2 2 | 2 | (6 rows) m_db=# SELECT MAX(DISTINCT salary) FROM m_test GROUP BY age; max ----- 2 (2 rows) m_db=# DROP TABLE m_test; DROP TABLE
MIN
MIN([ALL | DISTINCT] expr)
描述:返回输入expr的最小值,NULL值将被忽略。
参数类型:任意数值、字符串、日期时间类型。
返回值类型:
- 返回值类型与参数数据类型相同。
- 如果expr中的值均为NULL,则MIN()返回NULL。
- 如果指定ALL或者不指定ALL与DISTINCT,则返回expr中所有非空值的最小值。
- 如果指定了DISTINCT,则返回expr中不同非空值的最小值,与不指定DISTINCT的结果相同。
示例:
m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age); CREATE TABLE m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL); INSERT 0 6 m_db=# SELECT * FROM m_test; age | salary -----+-------- 1 | 1 | 1 1 | 2 1 | 2 2 | 2 | (6 rows) m_db=# SELECT MIN(DISTINCT salary) FROM m_test GROUP BY age; min ----- 1 (2 rows) m_db=# DROP TABLE m_test; DROP TABLE
SUM
SUM([ALL | DISTINCT] expr)
描述:返回输入expr的和,NULL值将被忽略。
参数类型:可以是TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、DECIMAL、FLOAT、DOUBLE。
返回值类型:
- 返回值类型视入参数据类型而定。当入参为精确值(INT、DECIMAL)时,返回DECIMAL;当入参为近似值(FLOAT、DOUBLE)时返回DOUBLE类型。
- 如果expr中的值均为NULL,则SUM()返回NULL。
- 如果指定ALL或者不指定ALL与DISTINCT,则返回expr中所有非空值的和。
- 如果指定DISTINCT,则返回expr中不同非空值的和。
示例:
m_db=# CREATE TABLE m_test(age INT, salary INT) DISTRIBUTE BY HASH(age); CREATE TABLE m_db=# INSERT INTO m_test VALUES(1, NULL), (1, 1), (1, 2), (1, 2), (2, NULL), (2, NULL); INSERT 0 6 m_db=# SELECT * FROM m_test; age | salary -----+-------- 1 | 1 | 1 1 | 2 1 | 2 2 | 2 | (6 rows) m_db=# SELECT age, SUM(salary) FROM m_test GROUP BY (age); age | sum -----+----- 1 | 5 2 | (2 rows) m_db=# SELECT age, SUM(DISTINCT salary) FROM m_test GROUP BY (age); age | sum -----+----- 1 | 3 2 | (2 rows) m_db=# DROP TABLE m_test; DROP TABLE