
# 聚集函数
#### sum(expression)
描述：所有输入行的expression总和。
返回类型：
通常情况下输入数据类型和输出数据类型是相同的，但以下情况会发生类型转换：
- 对于SMALLINT或INT输入，输出类型为BIGINT。
- 对于BIGINT输入，输出类型为NUMBER 。
- 对于浮点数输入，输出类型为DOUBLE PRECISION。
示例：
```
SELECT SUM(ss_ext_tax) FROM tpcds.STORE_SALES;
  sum      
--------------
 213267594.69
(1 row)
```
#### max(expression)
描述：所有输入行中expression的最大值。
参数类型：任意数组、数值、字符串、日期/时间类型。
返回类型：与参数数据类型相同。
示例：
```
SELECT MAX(inv_quantity_on_hand) FROM tpcds.inventory;
   max   
---------
 1000000
(1 row)
```
#### min(expression)
描述：所有输入行中expression的最小值。
参数类型：任意数组、数值、字符串、日期/时间类型。
返回类型：与参数数据类型相同。
示例：
```
SELECT MIN(inv_quantity_on_hand) FROM tpcds.inventory;
 min 
-----
   0
(1 row)
```
#### avg(expression)
描述：所有输入值的均值（算术平均）。
返回类型：
- 对于任何整数类型输入，结果都是NUMBER类型。
- 对于任何浮点输入，结果都是DOUBLE PRECISION类型。
- 其他，和输入数据类型相同。
示例：
```
SELECT AVG(inv_quantity_on_hand) FROM tpcds.inventory;
         avg          
----------------------
 500.0387129084044604
(1 row)
```
#### count(expression)
描述：返回表中满足expression不为NULL的行数。
返回类型：BIGINT
示例：
```
SELECT COUNT(inv_quantity_on_hand) FROM tpcds.inventory;
  count   
----------
 11158087
(1 row)
```
#### count(\*)
描述：返回表中的记录行数。
返回类型：BIGINT
示例：
```
SELECT COUNT(*) FROM tpcds.inventory;
  count   
----------
 11745000
(1 row)
```
#### array_agg(expression)
描述：将所有输入值（包括空）连接成一个数组。函数入参不支持数组形式。
返回类型：参数类型的数组。
示例：
创建表employeeinfo，并插入数据：
```
CREATE EXTERNAL TABLE employeeinfo (empno smallint, ename varchar(20), job varchar(20), hiredate date,deptno smallint) store AS orc;
INSERT INTO employeeinfo VALUES (7155, 'JACK', 'SALESMAN', '2018-12-01', 30);
INSERT INTO employeeinfo VALUES (7003, 'TOM', 'FINANCE', '2016-06-15', 20);
INSERT INTO employeeinfo VALUES (7357, 'MAX', 'SALESMAN', '2020-10-01', 30);
SELECT * FROM employeeinfo;
 empno | ename |   job    |      hiredate       | deptno
-------+-------+----------+---------------------+--------
  7155 | JACK  | SALESMAN | 2018-12-01 00:00:00 |     30
  7357 | MAX   | SALESMAN | 2020-10-01 00:00:00 |     30
  7003 | TOM   | FINANCE  | 2016-06-15 00:00:00 |     20
(3 rows)
```
查询部门编号为30的所有员工姓名：
```
SELECT array_agg(ename) FROM employeeinfo where deptno = 30;
 array_agg
------------
 {JACK,MAX}
(1 row)
```
查询属于同一个部门的所有员工：
```
SELECT deptno, array_agg(ename) FROM employeeinfo group by deptno;
 deptno | array_agg
--------+------------
     30 | {JACK,MAX}
     20 | {TOM}
(2 rows)
SELECT distinct array_agg(ename) OVER (PARTITION BY deptno) FROM employeeinfo;
 array_agg
------------
 {TOM}
 {JACK,MAX}
(2 rows)
```
查询所有的部门编号且去重：
```
SELECT array_agg(distinct deptno) FROM employeeinfo group by deptno;
 array_agg
-----------
 {20}
 {30}
(2 rows)
```
#### string_agg(expression, delimiter)
描述：将输入值连接成为一个字符串，用分隔符分开。
返回类型：和参数数据类型相同。
示例：
基于创建的表employeeinfo，查询属于同一个部门的所有员工：
```
SELECT deptno, string_agg(ename,',') FROM employeeinfo group by deptno;
 deptno | string_agg
--------+------------
     30 | JACK,MAX
     20 | TOM
(2 rows)
```
查询工号小于7156的员工：
```
SELECT string_agg(ename,',') FROM employeeinfo where empno < 7156;
 string_agg
------------
 TOM,JACK
(1 row)
```
#### covar_pop(Y, X)
描述：总体协方差。
返回类型：double precision
示例：
```
SELECT COVAR_POP(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    covar_pop     
------------------
 829.749627587403
(1 row)
```
#### covar_samp(Y, X)
描述：样本协方差。
返回类型：double precision
示例：
```
SELECT COVAR_SAMP(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    covar_samp    
------------------
 830.052235037289
(1 row)
```
#### stddev_pop(expression)
描述：总体标准差。
返回类型：对于浮点类型的输入返回double precision，其他输入返回numeric。
示例：
```
SELECT STDDEV_POP(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
    stddev_pop    
------------------
 289.224294957556
(1 row)
```
#### stddev_samp(expression)
描述：样本标准差。
返回类型：对于浮点类型的输入返回double precision，其他输入返回numeric。
示例：
```
SELECT STDDEV_SAMP(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
   stddev_samp    
------------------
 289.224359757315
(1 row)
```
#### var_pop(expression)
描述：总体方差（总体标准差的平方）。
返回类型：对于浮点类型的输入返回double precision类型，其他输入返回numeric类型。
示例：
```
SELECT VAR_POP(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
      var_pop       
--------------------
 83650.692793695475
(1 row)
```
#### var_samp(expression)
描述：样本方差（样本标准差的平方）。
返回类型：对于浮点类型的输入返回double precision类型，其他输入返回numeric类型。
示例：
```
SELECT VAR_SAMP(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
      var_samp      
--------------------
 83650.730277028768
(1 row)
```
#### bit_and(expression)
描述：所有非NULL输入值的按位与（AND），如果全部输入值皆为NULL，那么结果也为NULL 。
返回类型：和参数数据类型相同。
示例：
```
SELECT BIT_AND(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
 bit_and 
---------
       0
(1 row)
```
#### bit_or(expression)
描述：所有非NULL输入值的按位或（OR），如果全部输入值皆为NULL，那么结果也为NULL。
返回类型：和参数数据类型相同
示例：
```
SELECT BIT_OR(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
 bit_or 
--------
   1023
(1 row)
```
#### bool_and(expression)
描述：如果所有输入值都是真，则为真，否则为假。
返回类型：bool
示例：
```
SELECT bool_and(100 <2500);
 bool_and
----------
 t
(1 row)
```
#### bool_or(expression)
描述：如果所有输入值只要有一个为真，则为真，否则为假。
返回类型：bool
示例：
```
SELECT bool_or(100 <2500);
 bool_or
----------
 t
(1 row)
```
#### corr(Y, X)
描述：相关系数。
返回类型：double precision
示例：
```
SELECT CORR(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
       corr        
-------------------
 0.0381383624904186
(1 row)
```
#### every(expression)
描述：等效于bool_and。
返回类型：bool
示例：
```
SELECT every(100 <2500);
 every
-------
 t
(1 row)
```
#### rank(expression)
描述：根据expression对不同组内的元组进行跳跃排序。
返回类型：bigint
示例：
```
SELECT d_moy, d_fy_week_seq, rank() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2;
   d_moy | d_fy_week_seq | rank 
-------+---------------+------
     1 |             1 |    1
     1 |             1 |    1
     1 |             1 |    1
     1 |             1 |    1
     1 |             1 |    1
     1 |             1 |    1
     1 |             1 |    1
     1 |             2 |    8
     1 |             2 |    8
     1 |             2 |    8
     1 |             2 |    8
     1 |             2 |    8
     1 |             2 |    8
     1 |             2 |    8
     1 |             3 |   15
     1 |             3 |   15
     1 |             3 |   15
     1 |             3 |   15
     1 |             3 |   15
     1 |             3 |   15
     1 |             3 |   15
     1 |             4 |   22
     1 |             4 |   22
     1 |             4 |   22
     1 |             4 |   22
     1 |             4 |   22
     1 |             4 |   22
     1 |             4 |   22
     1 |             5 |   29
     1 |             5 |   29
     2 |             5 |    1
     2 |             5 |    1
     2 |             5 |    1
     2 |             5 |    1
     2 |             5 |    1
     2 |             6 |    6
     2 |             6 |    6
     2 |             6 |    6
     2 |             6 |    6
     2 |             6 |    6
     2 |             6 |    6
     2 |             6 |    6
(42 rows)
```
#### regr_avgx(Y, X)
描述：自变量的平均值 (sum(X)/N)。
返回类型：double precision
示例：
```
SELECT REGR_AVGX(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    regr_avgx     
------------------
 578.606576740795
(1 row)
```
#### regr_avgy(Y, X)
描述：因变量的平均值 (sum(Y)/N)。
返回类型：double precision
示例：
```
SELECT REGR_AVGY(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    regr_avgy     
------------------
 50.0136711629602
(1 row)
```
#### regr_count(Y, X)
描述：两个表达式都不为NULL的输入行数。
返回类型：bigint
示例：
```
SELECT REGR_COUNT(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
 regr_count 
------------
       2743
(1 row)
```
#### regr_intercept(Y, X)
描述：根据所有输入的点(X, Y)按照最小二乘法拟合成一个线性方程，然后返回该直线的Y轴截距。
返回类型：double precision
示例：
```
SELECT REGR_INTERCEPT(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
  regr_intercept  
------------------
 49.2040847848607
(1 row)
```
#### regr_r2(Y, X)
描述：相关系数的平方。
返回类型：double precision
示例：
```
SELECT REGR_R2(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
      regr_r2       
--------------------
 0.00145453469345058
(1 row)
```
#### regr_slope(Y, X)
描述：根据所有输入的点(X, Y)按照最小二乘法拟合成一个线性方程， 然后返回该直线的斜率。
返回类型：double precision
示例：
```
SELECT REGR_SLOPE(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
     regr_slope     
--------------------
 0.00139920009665259
(1 row)
```
#### regr_sxx(Y, X)
描述：sum(X\^2) - sum(X)\^2/N （自变量的"平方和"）。
返回类型：double precision
示例：
```
SELECT REGR_SXX(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
     regr_sxx     
------------------
 1626645991.46135
(1 row)
```
#### regr_sxy(Y, X)
描述：sum(X\*Y) - sum(X) \* sum(Y)/N （自变量和因变量的"乘方积"）。
返回类型：double precision
示例：
```
SELECT REGR_SXY(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
     regr_sxy     
------------------
 2276003.22847225
(1 row)
```
#### regr_syy(Y, X)
描述：sum(Y\^2) - sum(Y)\^2/N（因变量的"平方和"）。
返回类型：double precision
示例：
```
SELECT REGR_SYY(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    regr_syy     
-----------------
 2189417.6547314
(1 row)
```
#### stddev(expression)
描述：stddev_samp的别名。
返回类型：对于浮点类型的输入返回double precision，其他输入返回numeric。
示例：
```
SELECT STDDEV(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
      stddev      
------------------
 289.224359757315
(1 row)
```
#### variance(expression)
描述：var_samp的别名。
返回类型：对于浮点类型的输入返回double precision类型，其他输入返回numeric类型。
示例：
```
SELECT VARIANCE(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
      variance      
--------------------
 83650.730277028768
(1 row)
```
#### UNIQ(col_name)
描述：计算非重复值个数的聚合函数，与COUNT DISTINCT类似，即计算某一列去重后的行数，结果返回一个去重值。
入参说明：col_name指需要计算去重后行数的列。支持SMALLINT、INTEGER、BIGINT、REAL、DOUBLE PRECISION、TEXT、VARCHAR、TIMESTAMP、TIMESTAMPTZ、DATE、TIMETZ、UUID类型。
![](https://support.huaweicloud.com/sqlref-aura-aidatalake/public_sys-resources/note_3.0-zh-cn.png)
- 使用UNIQ函数时，SQL需要包含GROUP BY，为了取得更好性能所选GROUP BY字段分布需要尽量均匀。
- 建议当SQL中需要去重的列大于等于3列时，使用UNIQ函数去重，以取得比COUNT DISTINCT更好的效果。
- 一般情况下UNIQ函数内存消耗低于COUNT DISTINCT，如果使用COUNT DISTINCT时遇到内存超限，可以使用UNIQ函数进行替换。
 
示例：
```
CREATE EXTERNAL TABLE employeeinfo (empno smallint, ename varchar(20), job varchar(20), hiredate date,deptno smallint) store AS orc;
INSERT INTO employeeinfo VALUES (7155, 'JACK', 'SALESMAN', '2018-12-01', 30);
INSERT INTO employeeinfo VALUES (7003, 'TOM', 'FINANCE', '2016-06-15', 20);
INSERT INTO employeeinfo VALUES (7357, 'MAX', 'SALESMAN', '2020-10-01', 30);
SELECT UNIQ(deptno) FROM employeeinfo GROUP BY ename;
 uniq
------
    1
    1
    1
(3 rows)
```
