更新时间:2026-07-03 GMT+08:00
分享

聚集函数

sum(expression)

描述:所有输入行的expression总和。

返回类型:

通常情况下输入数据类型和输出数据类型是相同的,但以下情况会发生类型转换:

  • 对于SMALLINT或INT输入,输出类型为BIGINT。
  • 对于BIGINT输入,输出类型为NUMBER 。
  • 对于浮点数输入,输出类型为DOUBLE PRECISION。

示例:

1
2
3
4
5
SELECT SUM(ss_ext_tax) FROM tpcds.STORE_SALES;
  sum      
--------------
 213267594.69
(1 row)

max(expression)

描述:所有输入行中expression的最大值。

参数类型:任意数组、数值、字符串、日期/时间类型。

返回类型:与参数数据类型相同。

示例:

1
2
3
4
5
SELECT MAX(inv_quantity_on_hand) FROM tpcds.inventory;
   max   
---------
 1000000
(1 row)

min(expression)

描述:所有输入行中expression的最小值。

参数类型:任意数组、数值、字符串、日期/时间类型。

返回类型:与参数数据类型相同。

示例:

1
2
3
4
5
SELECT MIN(inv_quantity_on_hand) FROM tpcds.inventory;
 min 
-----
   0
(1 row)

avg(expression)

描述:所有输入值的均值(算术平均)。

返回类型:

  • 对于任何整数类型输入,结果都是NUMBER类型。
  • 对于任何浮点输入,结果都是DOUBLE PRECISION类型。
  • 其他,和输入数据类型相同。

示例:

1
2
3
4
5
SELECT AVG(inv_quantity_on_hand) FROM tpcds.inventory;
         avg          
----------------------
 500.0387129084044604
(1 row)

count(expression)

描述:返回表中满足expression不为NULL的行数。

返回类型:BIGINT

示例:

1
2
3
4
5
SELECT COUNT(inv_quantity_on_hand) FROM tpcds.inventory;
  count   
----------
 11158087
(1 row)

count(*)

描述:返回表中的记录行数。

返回类型:BIGINT

示例:

1
2
3
4
5
SELECT COUNT(*) FROM tpcds.inventory;
  count   
----------
 11745000
(1 row)

array_agg(expression)

描述:将所有输入值(包括空)连接成一个数组。函数入参不支持数组形式。

返回类型:参数类型的数组。

示例:

创建表employeeinfo,并插入数据:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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的所有员工姓名:

1
2
3
4
5
SELECT array_agg(ename) FROM employeeinfo where deptno = 30;
 array_agg
------------
 {JACK,MAX}
(1 row)

查询属于同一个部门的所有员工:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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)

查询所有的部门编号且去重:

1
2
3
4
5
6
SELECT array_agg(distinct deptno) FROM employeeinfo group by deptno;
 array_agg
-----------
 {20}
 {30}
(2 rows)

string_agg(expression, delimiter)

描述:将输入值连接成为一个字符串,用分隔符分开。

返回类型:和参数数据类型相同。

示例:

基于创建的表employeeinfo,查询属于同一个部门的所有员工:

1
2
3
4
5
6
SELECT deptno, string_agg(ename,',') FROM employeeinfo group by deptno;
 deptno | string_agg
--------+------------
     30 | JACK,MAX
     20 | TOM
(2 rows)

查询工号小于7156的员工:

1
2
3
4
5
SELECT string_agg(ename,',') FROM employeeinfo where empno < 7156;
 string_agg
------------
 TOM,JACK
(1 row)

covar_pop(Y, X)

描述:总体协方差。

返回类型:double precision

示例:

1
2
3
4
5
 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

示例:

1
2
3
4
5
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。

示例:

1
2
3
4
5
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。

示例:

1
2
3
4
5
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类型。

示例:

1
2
3
4
5
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类型。

示例:

1
2
3
4
5
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 。

返回类型:和参数数据类型相同。

示例:

1
2
3
4
5
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。

返回类型:和参数数据类型相同

示例:

1
2
3
4
5
SELECT BIT_OR(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
 bit_or 
--------
   1023
(1 row)

bool_and(expression)

描述:如果所有输入值都是真,则为真,否则为假。

返回类型:bool

示例:

1
2
3
4
5
SELECT bool_and(100 <2500);
 bool_and
----------
 t
(1 row)

bool_or(expression)

描述:如果所有输入值只要有一个为真,则为真,否则为假。

返回类型:bool

示例:

1
2
3
4
5
SELECT bool_or(100 <2500);
 bool_or
----------
 t
(1 row)

corr(Y, X)

描述:相关系数。

返回类型:double precision

示例:

1
2
3
4
5
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

示例:

1
2
3
4
5
SELECT every(100 <2500);
 every
-------
 t
(1 row)

rank(expression)

描述:根据expression对不同组内的元组进行跳跃排序。

返回类型:bigint

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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

示例:

1
2
3
4
5
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

示例:

1
2
3
4
5
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

示例:

1
2
3
4
5
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

示例:

1
2
3
4
5
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

示例:

1
2
3
4
5
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

示例:

1
2
3
4
5
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

示例:

1
2
3
4
5
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

示例:

1
2
3
4
5
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

示例:

1
2
3
4
5
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。

示例:

1
2
3
4
5
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类型。

示例:

1
2
3
4
5
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类型。

  • 使用UNIQ函数时,SQL需要包含GROUP BY,为了取得更好性能所选GROUP BY字段分布需要尽量均匀。
  • 建议当SQL中需要去重的列大于等于3列时,使用UNIQ函数去重,以取得比COUNT DISTINCT更好的效果。
  • 一般情况下UNIQ函数内存消耗低于COUNT DISTINCT,如果使用COUNT DISTINCT时遇到内存超限,可以使用UNIQ函数进行替换。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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)

相关文档