探索Postgresql的Grouping Sets功能:数据统计的新利器

发表时间: 2023-02-25 23:44

们在进行数据统计的时候,经常需要对数据的不同维度进行聚合。例如对于下列数据:

我们经常会需要,按性别维度统计出男员工的工资总和是多少、最大工资是多少,女员工的工资总和是多少,最大工资是多少。同时也要按职业统计出医生和护士的最大工资,工资总额,甚至还需要分别统计出男医生、男护士、女医生、女护士的最大工资和工资总额是多少。

对于这些需要,在此前的版本中,我们只能一句句写SQL,例如通过

Select sex, sum(salary), max(salary) from salary group by sex;

查询出按性别分组的最大工资和工资总额。

结果如下:


可见,我们可以按照性别来分组聚合。那么对多个维度进行聚合的话,有没有更省事的方法呢?答案是有的。

在Postgresql9.5之后,增加了Grouping sets的新功能,允许我们通过一句SQL完成几个不同维度的分组汇合。

其语法如下:

SELECT column1, column2, aggregate_function(column3)

FROM table_name

GROUP BY GROUPING SETS ((column1, column2),(column1),(column2),());

对于上面的表,我们可以通过

select sex, job, sum(salary), max(salary) from salary

group by grouping sets((sex, job), sex, job);


语句,直接查询出我们所需要的所有维度的聚合数据。其语法就是在grouping sets关键字之后,把需要聚合的维度全部列出来,例如上面的例子里,就以“性别+职业”、“性别”、“职业”这三个维度,对数据进行聚合,从而一次性完成所有所需维度的聚合。其结果如下:

从结果中我们可以看出,所有维度的聚合数据都查询出来了,是不是很简单呢?

喜欢本文的话,欢迎关注活在信息时代哦:)