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......]
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值