首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PG:什么是grouping sets

PG:什么是grouping sets

作者头像
yzsDBA
发布2022-03-29 11:36:44
6370
发布2022-03-29 11:36:44
举报

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

https://mp.weixin.qq.com/s?__biz=MzU1OTgxMjA4OA==&mid=2247484647&idx=1&sn=6ad81bfe9842bcba9ef3603efc18d14f&chksm=fc10d870cb675166f89a179e18fd2b56a343fe13234e1354b478c386935f890207d70c64c407&token=149355293&lang=zh_CN#rd]

那么什么是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个聚合。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yanzongshuaiDBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档