本文主要是介绍GreenPlum[postgreSQL]之-Grouping Sets、grouping()函数、cube方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
GreenPlum[postgreSQL]之-Grouping Sets
前言
grouping sets是为了简化代码而设计的一种风格,通常可以将不同纬度的统计数据放在同一个视图或者表中,有点类似于cube立方体的风格。
参考网址:https://www.postgresqltutorial.com/postgresql-grouping-sets/
1 需求
现有以下数据,其中brand\segment
是纬度,我们需要根据这2个纬度算出所有维度组合下的所有的sum()度量metrix
。
DROP TABLE IF EXISTS sales;
CREATE TABLE sales (brand VARCHAR NOT NULL,segment VARCHAR NOT NULL,quantity INT NOT NULL,PRIMARY KEY (brand, segment)
);INSERT INTO sales (brand, segment, quantity)
VALUES('ABC', 'Premium', 100),('ABC', 'Basic', 200),('XYZ', 'Premium', 100),('XYZ', 'Basic', 300);
需求目标如下,展示以下数据。
2 实现方式
2.1 union all的方式
select brand,segment,sum(quantity) from sales group by brand,segment
union all
select brand,null,sum(quantity) from sales group by brand
union all
select null,segment,sum(quantity) from sales group by segment
union all
select null,null,sum(quantity) from sales ;
2.2 grouping sets的方式
--很明显代码简洁了许多,如果纬度组合较多,那么这种方式会更加方便简洁
select brand,segment,sum(quantity) from sales
group by grouping sets((brand,segment),(brand),(segment),())
2.3 grouping 方法
pg既然提供了grouping sets,就提供了对应了对应的grouping()函数,用来判断是否该纬度在该指标统计中是否被用到
- 用到,返回0
- 没用到,返回1
select grouping(brand) as brand_used,grouping(segment) as segment_used,brand,segment,sum(quantity)
from sales
group by grouping sets((brand,segment),(brand),(segment),())
having grouping(brand) = 1
2.4 cube方式
除了grouping sets可以动态选择不同的维度组合,cube自动选择所有的维度组合,构建多维模型。
select brand,segment,sum(quantity) from sales
group by cube(brand,segment)--[,another_dimensions......]
这篇关于GreenPlum[postgreSQL]之-Grouping Sets、grouping()函数、cube方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!