GreenPlum[postgreSQL]之-Grouping Sets、grouping()函数、cube方式

2023-12-10 13:38

本文主要是介绍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方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/477254

相关文章

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方