
# 聚集函数嵌套
描述：对聚集函数分组计算的结果再进行一次聚集函数操作。
一般可描述为：
```
SELECT AGG1(AGG2(column_name1)) FROM table_name GROUP BY column_name2;
```
等价为：
```
SELECT AGG1(value) FROM (SELECT AGG2(column_name1) value FROM table_name GROUP BY column_name2);
```
其中：
- AGG1()：表示外层聚集函数。
- AGG2()：表示内层聚集函数。
- table_name：表示表名。
- column_name1、column_name2：表示列名。
- value：表示内层聚集函数结果的别名。
整体含义可描述为：将内层聚集函数AGG2()分组计算的结果作为外层聚集函数AGG1()的输入再计算一次。
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
1. 嵌套的聚集函数应位于SELECT和FROM之间，否则无意义。
2. 使用嵌套聚集函数的SELECT语句应包含GROUP BY子句。
3. 与嵌套聚集函数同时被SELECT的，应同为嵌套聚集函数，或为常量表达式。
4. 聚集函数仅支持一次聚集函数嵌套操作。
5. 当前支持以下聚集函数之间的嵌套：avg、max、min、sum、var_pop、var_samp、variance、stddev_pop、stddev_samp、stddev、median、regr_sxx、regr_syy、regr_sxy、regr_avgx、regr_avgy、regr_r2、regr_slope、regr_intercept、covar_pop、covar_samp、corr和listagg。
6. 内层聚集函数的返回结果类型应符合外层聚集函数的参数类型。
 
示例：
```
gaussdb=# CREATE TABLE test1 (id INT,val INT);
CREATE TABLE
gaussdb=# INSERT INTO test1 VALUES (1, 1);
INSERT 0 1
gaussdb=# INSERT INTO test1 VALUES (1, null);
INSERT 0 1
gaussdb=# INSERT INTO test1 VALUES (2, 10);
INSERT 0 1
gaussdb=# INSERT INTO test1 VALUES (2, 55);
INSERT 0 1
gaussdb=# SELECT SUM(MIN(val)) FROM test1 GROUP BY id;
 sum
-----
  11
(1 row)
gaussdb=# DROP TABLE test1;
DROP TABLE
```
