PostgreSQL中 GROUPING SETS、CUBE 和 ROLLUP功能

PostgreSQL 中,GROUPING SETS、CUBE 和 ROLLUP 的功能,允许在查询中更灵活地生成聚合结果,而不需要多次重写查询或使用复杂的 UNION 语句。这些功能在数据分析中特别有用,因为它们允许你以不同的维度对数据进行分组和聚合。

1、测试表及数据准备

1.1、json_to_recordset内置函数

It joins two functions into a single FROM target. json_to_recordset() is instructed to return three columns, the first integer , the second text and the third text.

The result of generate_series() is used directly. The ORDER BY clause sorts the column values as integers.

在 PostgreSQL 中 json_to_recordset 的内置函数,主要目的是将 JSON 数据转换为 SQL 可以查询的记录集(recordset)或表格式

1.2、创建测试表

CREATE table t_sales_table
as 
SELECT *
FROM ROWS FROM(json_to_recordset('[{"sales":10,"b":"foo","size":"L"},{"sales":"20","b":"bar","size":"M"},{"sales":15,"b":"foo","size":"M"},{"sales":5,"b":"bar","size":"L"},{"sales":3,"b":"super","size":"L"}]')AS ( b TEXT,size TEXT,sales INTEGER),generate_series(1, 5) ) AS T1 (brand, c_size, c_qty,id)
ORDER BY id;select * from t_sales_table;superdb=# select * from t_sales_table;brand | c_size | c_qty | id
-------+--------+-------+----foo   | L      |    10 |  1bar   | M      |    20 |  2foo   | M      |    15 |  3bar   | L      |     5 |  4super | L      |     3 |  5
(5 rows)

2、GROUPING SETS

GROUPING SETS 允许你指定多个分组条件,并一次性生成每个分组条件的结果。例如,如果你想根据 (brand ) 和 (c_size ) 对销售数量进行分组,并同时看到按brand、按c_size和整体的总销售数量,你可以使用 GROUPING SETS。

superdb=# SELECT brand, c_size, SUM(c_qty)
FROM t_sales_table
GROUP BY GROUPING SETS ((brand),(c_size),()  -- 空集表示所有行的聚合,即整体的总销售额
)
ORDER BY brand,c_size;brand | c_size | sum
-------+--------+-----bar   |        |  25foo   |        |  25super |        |   3| L      |  18| M      |  35|        |  53
(6 rows)

3、使用多个SELECT语句进行分组 及UNION ALL 集合运算符

SELECT brand, NULL as c_size, sum(c_qty) as sum_c_qty FROM t_sales_table GROUP BY brand
UNION ALL
SELECT null as brand, c_size, sum(c_qty) as sum_c_qty FROM t_sales_table GROUP BY c_size
UNION ALL
SELECT NULL as brand, NULL as c_size, sum(c_qty) as sum_c_qty FROM t_sales_table;brand | c_size | sum_c_qty
-------+--------+-----------bar   |        |        25foo   |        |        25super |        |         3| L      |        18| M      |        35|        |        53
(6 rows)

4、CUBE and ROLLUP

4.1、CUBE会枚举指定列的所有可能组合作为Grouping Sets。

CUBE 是 GROUPING SETS 的一个超集,它会自动生成所有可能的分组组合(包括所有维度、每个维度、以及所有维度的组合)

https://www.postgresql.org/docs/current/queries-table-expressions.html#QUERIES-GROUPING-SETS

select brand,c_size,sum(c_qty) as sum_c_qty
from t_sales_table
superdb-# GROUP BY CUBE(brand,c_size);brand | c_size | sum_c_qty
-------+--------+-----------|        |        53bar   | M      |        20super | L      |         3foo   | M      |        15bar   | L      |         5foo   | L      |        10bar   |        |        25foo   |        |        25super |        |         3| L      |        18| M      |        35
(11 rows)
CUBE ( a, b, c )

is equivalent to

GROUPING SETS (( a, b, c ),( a, b    ),( a,    c ),( a       ),(    b, c ),(    b    ),(       c ),(         )
)

4.2、ROLLUP会以按层级聚合的方式产生Grouping Sets

ROLLUP 是 GROUPING SETS 的一个子集,它生成从所有维度到每个维度的聚合,以及所有维度的组合的聚合。这与 CUBE 不同,因为 ROLLUP 不包括所有可能的分组组合。

select brand,c_size,sum(c_qty) as sum_c_qty
from t_sales_table
superdb-# GROUP BY ROLLUP(brand,c_size);brand | c_size | sum_c_qty
-------+--------+-----------|        |        53bar   | M      |        20super | L      |         3foo   | M      |        15bar   | L      |         5foo   | L      |        10bar   |        |        25foo   |        |        25super |        |         3
(9 rows)
ROLLUP ( e1, e2, e3, ... )

it is equivalent to

GROUPING SETS (( e1, e2, e3, ... ),...( e1, e2 ),( e1 ),( )
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/34422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

持久化容器数据

持久化容器数据 目录 容器卷管理卷试一试 使用卷查看卷内容删除卷 当一个容器启动时,它会使用镜像提供的文件和配置。每个容器可以创建、修改和删除文件,并且不会影响其他容器。当容器被删除时,这些文件更改也会被删除。 虽然容器的这种短…

【因果推断python】53_效应异质性和非线性带来的挑战1

目录 Treatment Effects on Binary Outcomes 合成一些数据 由于缺乏基本事实,在单位层面预测治疗效果极为困难。因为我们只能观察到一个潜在结果 T(t) ,我们无法直接估计它。相反,我们必须依靠目标变换(也可以看作是设计巧妙的损…

【专利】一种光伏产品缺陷检测AI深度学习算法

申请号CN202410053849.9公开号(公开)CN118037635A申请日2024.01.12申请人(公开)超音速人工智能科技股份有限公司发明人(公开)张俊峰(总); 叶长春(总); 廖绍伟 摘要 本发明公开一种光伏产品缺陷检测AI深度…

全国计算机二级C++题库笔记

全国计算机二级C题库笔记 Ⅰ. 选择题专项训练1 公共基础部分2 二级C程序设计第1~4章》每章标题1. C标识符命名规则2. 面向对象的三个主要特征3. C的四个开发步骤4. 关于类和对象的叙述5. !和&&的作用6. C枚举类型初值问题7. ASCII码对照表8. 运算符两边的数据类型&…

linux高级编程(I/O)

fputc int fputc(int c, FILE *stream); 功能: 向流中写入一个字符 参数: c:要写入的字符 stream:文件流指针 返回值: 成功返回写入的字符ASCII码值 失败返回EOF fgetc int fgetc(FILE *stream); 功能: 从流中读取一个字符 参数: stream:文件流…

SAPUI5基础知识8 - 模块(Module)的使用

1. 背景 在SAPUI5中,几乎所有东西都是一个模块(例如:控件,控制器,组件等等),通过依赖管理,模块间可以相互调用。这样做的好处是,可以仅在需要时才去加载必需的模块&…

基于单片机的智能台灯控制系统

摘要: 文章设计一款单片机智能台灯控制系统,实现对台灯的手动和自动控制功能,以 STC89C52 单片机作为多功能智能台灯的主控制器,光电检测模块检测坐姿,红外传感器检测人体,光敏电阻检测光强,同…

怀庄酒厂在茅台镇排第几,怀庄酒都什么档次?

怀庄酒厂在茅台镇的排名如何?怀庄酒又属于什么档次?贵州怀庄酒业(集团)有限责任公司旗下的怀庄之醉,作为公司的重点直营品牌,定位于中高端酱酒市场,以其出色的品质和独特的风味受到消费者的青睐。 在众多贵州酒厂中&am…

搭建淘宝扭蛋机小程序需要满足哪些条件

随着移动互联网的快速发展,小程序作为一种轻量级应用,以其便捷、高效的特点,逐渐成为了用户日常生活中不可或缺的一部分。特别是在电商平台中,小程序为商家和用户之间提供了更为直接的沟通桥梁。在这样一个背景下,搭建…

LeetCode题练习与总结:只出现一次的数字--136

一、题目描述 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 : …

C++ 检查内存泄漏

在Visual Studio中,通过定义自定义的new和delete操作符来检查内存泄漏并输出到输出窗口(通常是“输出”面板)并不是直接支持的,因为new操作符的调试版本(如使用_NORMAL_BLOCK, __FILE__, __LINE__)是由Micr…

深入理解Pandas

文章目录 引言Pandas的原理SeriesDataFrame Pandas的使用安装Pandas读取数据数据处理数据可视化 结论 引言 在数据分析和数据科学领域,Pandas无疑是一个不可或缺的工具。Pandas是一个强大的Python库,提供了快速、灵活和易于使用的数据结构和数据分析工具…

VoxEdit 竞赛|为 The Sandbox 土地持有者设计专属奖励资产

邀请大家参与这场精彩的 VoxEdit 竞赛,在元宇宙中发挥你的创造力,并将你的体素技能提升到新的水平! 按此下载 VoxEdit ! https://www.sandbox.game/en/create/vox-edit/ 比赛主题:建筑与古迹 一起潜入建筑和古迹的世…

【面试题】马上金九银十了,简历该准备起来了,面试题你准备好了吗 ?浅谈 JS 浅拷贝和深拷贝

代码展示 let obj_old {name: Tom,age: 15,favorite: {food: bread,drink: milk} } let obj_new {...obj_old} console.log(obj_old obj_new) // false console.log(obj_old.name obj_new.name) // true console.log(obj_old.favorite obj_new.favorite) // true3. Ar…

(79)SPI接口--->(004)FPGA实现SPI接口

(004)FPGA实现SPI接口 1 目录 (a)FPGA简介 (b)IC简介 (c)Verilog简介 (d)FPGA实现SPI接口 (e)结束 1 FPGA简介 (a)FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为…

Redis源码学习:SDS设计与内存管理

为什么Redis选择SDS 1、缓解C语言字符串的缺陷 在 C 语言中可以使用 char* 字符数组来实现字符串。每个字符串分配一段连续的内存空间,依次存放字符串中的每一个字符,最后以null字符结尾。这种设计存在以下问题: 1、低效的操作 每次获取字…

Linux根目录挂载点(/dev/mapper/centos-root)扩容

如果我们在安装系统是采用自定义分区的话,就可以提前规划好这个事情。但是如果平常没注意就直接采用默认安装的方式的话。一旦 根目录的容量耗尽,将会影响业务的运行。今天我们来扩容逻辑卷。 默认安装的话会给home目录分比较多的空间,我们可…

说一说强、软、弱、虚引用

Java根据其生命周期的长短将引用类型又分为强引用、软引用、弱引用、虚引用。 强引用:就是我们平时 new一个对象的引用。当JVM的内存空间不足时,宁愿抛出OutOfMemoryError使得程序异常终止,也不愿意回收具有强引用的存活着的对象。 软引用&a…

【Leetcode每日一题】 01背包 - DP41 【模板】01背包(难度⭐⭐)(80)

1. 题目解析 题目链接:DP41 【模板】01背包 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 第一问:不超过总体积的背包问题 1. 状态表示 dp[i][j] 表示:从前 i 个物品中挑选&…

汇编语言实验八

目录 一、实验目的 二、实验内容 三.实验步骤以及结果 1、阅读monthtab.asm 程序,要求写出该程序功能,并在实验报告中画出其程序流程图 2.编写一段程序,要求在长度为20的数组(无符号数)中,…