PG:什么是grouping sets

yzsDBA 2022-03-22
407 字丨阅读本文需 3 分钟

学习PG聚合操作机制时,看到ExecInitAgg中初始化时有对AggState中有pergroups等进行初始化[AggState的解释见上一篇:GreenPlum7聚合操作结构体之间关系

那么什么是pergroups呢,它的作用是什么?

ExecInitAgg中:可以看到组数等于组集合数(若没hash的话),每个分组中有numaggs个聚集

这里就需要理解什么是grouping sets。

PostgreSQL9.5版本引入了group by的分组集合功能,提供了GROUPING SETS,CUBE,ROLLUP参数。这些新的标准SQL选项可以让用户在一次查询中生成多个不同级别或者多维度的报表,而不是像以前一样需要几次查询。

postgres=# create table t1(id1 int,name varchar(20),class int,score int);

CREATE TABLE

postgres=# select * from t1; id1 |   name   | class | score

-----+----------+-------+-------   

1 | math     |     1 |    50   

2 | math     |     2 |    90   

3 | math     |     1 |    70   

5 | chinese  |     1 |    50   

6 | chinese  |     2 |    60   

4 | chinese  |     2 |    60   

7 | physical |     1 |    90  

8 | physical |     2 |    80

(8 行记录)

首先看下普通的group by:根据name和class字段求和:

可以看到到仅一个聚合分类。那么再看下GROUPING SETS语法:

有3种聚合分类:1)针对name进行分组然后求sum值;2)针对class进行分组,然后求sum值;3)grouping sets种的空,表示所有行都聚合到一个分组中。

需要注意,grouping sets的集合中,一个括号一个分组,如下(name,class)为一个分组。该语句等价于普通的group by。

总结:grouping sets中有一个集合,则有一个聚合;若有2个集合,则2个聚合。

免责声明:凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处本网。非本网作品均来自其他媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如您发现有任何侵权内容,请依照下方联系方式进行沟通,我们将第一时间进行处理。

0赞 好资讯,需要你的鼓励
来自:yzsDBA
0

参与评论

登录后参与讨论 0/1000

为你推荐

加载中...