讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在PostgreSQL 15中利用GROUPING SETS多维分析?

阿明小哥_8577

阿明小哥_8577

发布时间:2026-10-20 11:06:22

|

480人浏览过

|

来源于php中文网

原创

GROUPING SETS 是 PostgreSQL 15 中 GROUP BY 的语法扩展,非函数;必须写为 GROUP BY GROUPING SETS ((a), (a,b), ()),配合 GROUPING() 区分占位 NULL 与真实 NULL,MySQL 8.4 仍不支持。

如何在postgresql 15中利用grouping sets多维分析?

PostgreSQL 15 完全支持 GROUPING SETS,它不是函数,而是 GROUP BY 子句的语法扩展;用错位置或当成函数调用(比如写成 GROUPING_SETS())会直接报 ERROR: syntax error at or near "GROUPING"。

GROUPING SETS 的括号嵌套和空集写法

每个分组集必须用独立括号包裹,不能省略、不能多层嵌套,也不能混用表达式——例如 (dept, UPPER(region)) 在多数 PostgreSQL 版本中不被允许(需先在 SELECT 或子查询中计算)。

  • () 表示“零维度分组”,即全表聚合行,必须显式写出,不能用 GROUP BY () 替代整个 GROUPING SETS 块
  • 多个分组集之间用逗号分隔,末尾不能加逗号(否则 PostgreSQL 报 ERROR: syntax error at or near ")")
  • 字段顺序不影响聚合逻辑,但会影响 GROUPING() 返回值的位序(尤其配合 GROUPING_ID() 时)

必须用 GROUPING() 区分 NULL 是占位还是真实数据

PostgreSQL 不会自动标记哪一行是“部门小计”、哪一行是“原始 dept 为 NULL 的记录”。只靠 dept IS NULL 判断必然出错。

  • GROUPING(dept) 返回 0 表示该行按 dept 分了组,返回 1 表示 dept 是占位 NULL
  • 组合判断推荐用 CASE + GROUPING(),例如:CASE WHEN GROUPING(dept)=1 AND GROUPING(region)=0 THEN 'region_only' END
  • 如果用了 COALESCE(dept, '[Unknown]') 展示,不能用这个结果列参与 GROUPING() 判断——函数参数必须是原始列名

子查询预处理时要清除原始 NULL

当需要先做维度归并(如把多个产品类型映射为大类)、时间截断(DATE_TRUNC('month', order_time))再走 GROUPING SETS,必须在子查询里处理掉原始 NULL,否则外层 GROUPING() 会失效。

  • 错误写法:SELECT product_type, ... FROM (SELECT CASE WHEN category IN ('A','B') THEN 'Group1' END AS product_type FROM sales) t GROUP BY GROUPING SETS ((product_type)) —— 若原始 category 不匹配任何分支,product_type 就是 NULL,GROUPING(product_type) 仍返回 0,无法识别这是“未参与分组”
  • 正确写法:子查询中强制补缺,如 CASE WHEN category IN ('A','B') THEN 'Group1' ELSE '[Other]' END AS product_type
  • 性能提示:PostgreSQL 12+ 支持 MATERIALIZED CTE,对重子查询建议显式声明,避免多次执行

ROLLUP 和 CUBE 是语法糖,不是替代方案

ROLLUP(a,b) 等价于 GROUPING SETS ((a,b), (a), ()),但它不包含 (b);CUBE(a,b) 等价于 GROUPING SETS ((a,b), (a), (b), ())。想精确控制哪些组合出现,必须用 GROUPING SETS。

  • 误用 ROLLUP(country, region, city) 想获得“仅 region 汇总”?不行——它只出 (country,region,city)、(country,region)、(country)、() 四种,没有纯 region 行
  • CUBE 在高基数字段上极易爆炸,例如 CUBE(user_id, product_id) 在百万级表上可能生成亿级分组行,PostgreSQL 会 OOM 或超时
  • MySQL 用户注意:截至 2026 年 10 月,MySQL 8.4 仍不支持 GROUPING SETS,强行使用报 ERROR 1064,别抄 PostgreSQL 写法

最容易被忽略的是:所有参与 GROUPING SETS 的列,都必须出现在 SELECT 列表中(或作为 GROUPING() 参数),否则 PostgreSQL 报 ERROR: column "xxx" must appear in the GROUP BY clause or be used in an aggregate function;这个限制比普通 GROUP BY 更严格。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
大数据分析工具有哪四个
大数据分析工具有哪四个

大数据分析的四个工具分别是rapidminer、Hpcc、Hadoop和Pentaho bi。大数据分析用于从各种来源生成的原始数据中提取有价值的数据。这些数据帮助我们获得有意义的见解、隐藏的模式、未知的相关性、市场趋势等等,具体取决于行业。大数据分析的主要动机是提供有价值的见解,以便为未来做出更好的决策。php中文网为大家带来了大数据分析的相关教程、以及相关文章等内容,供大家免费下载使用。

5256

2023.06.21

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

1249

2025.12.08

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

243

2026.01.05

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

486

2026.01.05

postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4529

2023.11.02

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。更详细的postgresql常用命令,大家可以访问下面的文章。

647

2023.11.16

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有l、d、d5、di、ds、dv、df、dn、db、dg、dp、c、pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

1396

2023.11.20

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

80

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn