我们在进行数据统计的时候,经常需要对数据的不同维度进行聚合。例如对于下列数据:
我们经常会需要,按性别维度统计出男员工的工资总和是多少、最大工资是多少,女员工的工资总和是多少,最大工资是多少。同时也要按职业统计出医生和护士的最大工资,工资总额,甚至还需要分别统计出男医生、男护士、女医生、女护士的最大工资和工资总额是多少。
对于这些需要,在此前的版本中,我们只能一句句写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关键字之后,把需要聚合的维度全部列出来,例如上面的例子里,就以“性别+职业”、“性别”、“职业”这三个维度,对数据进行聚合,从而一次性完成所有所需维度的聚合。其结果如下:
从结果中我们可以看出,所有维度的聚合数据都查询出来了,是不是很简单呢?
喜欢本文的话,欢迎关注活在信息时代哦:)