
# 聚合函数
聚合函数对一组值进行计算，并返回单个的值。除了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) 描述：返回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\] ) 描述：返回expr中不同非空值的数量。
  参数类型：入参可以是任意类型。
  返回值类型：
  - 返回值类型为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
```
#### S**U**M
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
```
