Doris专题28-聚合多维分析

一、核心概念对比

ROLLUP(层级汇总)
  • 定义:生成层次化汇总,按指定列顺序从最细粒度逐步汇总到最高层。
  • 适用场景:需逐级汇总的场景,如按时间(年→月→日)、地理(国家→省→市)等维度。
  • 示例ROLLUP(YEAR(d_date), MONTH(d_date)) 会生成:
    • 年+月维度(如 2001 年 1 月)
    • 年仅维度(如 2001 年)
    • 总计(所有年份)
CUBE(全组合汇总)
  • 定义:生成所有可能的维度组合汇总,比 ROLLUP 更全面。
  • 适用场景:需分析所有维度组合的场景,如业务分析、市场调查。
  • 示例CUBE(YEAR(d_date), i_category) 会生成:
    • 年+品类(如 2001 年 Books)
    • 年仅(2001 年)
    • 品类仅(Books)
    • 总计
GROUPING SETS(自定义组合汇总)
  • 定义:指定特定维度组合进行汇总,比 ROLLUP/CUBE 更灵活。
  • 适用场景:仅需部分维度组合时,避免计算不必要的汇总,提升效率。
  • 示例GROUPING SETS((YEAR(d_date), i_category), (YEAR(d_date)), ()) 会生成:
    • 年+品类
    • 年仅
    • 总计

二、关键函数:解决 NULL 值歧义

GROUPING 函数
  • 作用:区分汇总行(由 ROLLUP/CUBE 生成)和原始数据中的 NULL 值。
  • 规则
    • 若列是汇总行(如 ROLLUP 生成的"年总计"),返回 1。
    • 若列是原始数据的 NULL 或普通值,返回 0。
  • 示例GROUPING(YEAR(d_date)) 可判断"年"列是否为汇总行。
GROUPING_ID 函数
  • 作用:用二进制位标识维度组合,更直观区分汇总层级。
  • 示例CUBE(a,b) 的 GROUPING_ID 对应:
    • a,b(明细行)→ 00 → ID=0
    • a(b 汇总)→ 01 → ID=1
    • b(a 汇总)→ 10 → ID=2
    • 总计 → 11 → ID=3

三、语法与示例

ROLLUP 语法
sql 复制代码
SELECT YEAR(d_date), MONTH(d_date), SUM(ss_net_paid)
FROM store_sales
GROUP BY ROLLUP(YEAR(d_date), MONTH(d_date));
  • 结果:包含年+月、年仅、总计三层汇总。
CUBE 语法
sql 复制代码
SELECT YEAR(d_date), i_category, SUM(ss_net_paid)
FROM store_sales
GROUP BY CUBE(YEAR(d_date), i_category);
  • 结果:包含年+品类、年仅、品类仅、总计四层汇总。
GROUPING SETS 语法
sql 复制代码
SELECT YEAR(d_date), i_category, SUM(ss_net_paid)
FROM store_sales
GROUP BY GROUPING SETS(
    (YEAR(d_date), i_category),  -- 年+品类
    (YEAR(d_date)),              -- 年仅
    ()                           -- 总计
);

四、应用场景总结

功能 适用场景 优势
ROLLUP 层级汇总(如时间、地理) 简洁,避免冗余汇总
CUBE 全维度组合分析(如市场调查) 覆盖所有可能组合
GROUPING SETS 自定义部分维度组合(如仅需年+品类) 灵活,减少计算资源消耗

五、注意事项

  • NULL 值处理:汇总行的 NULL 是"虚拟"的(由 ROLLUP/CUBE 生成),需用 GROUPING 函数区分。
  • 性能优化:若仅需部分维度组合,优先用 GROUPING SETS 而非 CUBE,避免计算不必要的汇总。
相关推荐
l1258658 小时前
# RAG低延迟架构设计:从5秒到500ms的优化全链路
数据库·人工智能·python·langchain
RisunJan8 小时前
Linux命令-vgdisplay(显示卷组详细属性)
linux·运维·数据库
Sayai8 小时前
Elasticsearch 日志索引设计:按小时切分 + 小时内 Rollover 兜底(ILM 实战,附完整脚本)
大数据·elasticsearch·搜索引擎
爱和冰阔落8 小时前
【MySQL 慢查询排查实战】列表接口逐渐变慢时,怎样从请求链路定位原因
android·数据库·mysql
JacksonMx8 小时前
企业级 JPA 与数据库架构落地指南
数据库·数据库架构
Dxy12393102168 小时前
MySQL有哪些锁?InnoDB锁体系完整梳理博客
数据库·mysql
wear工程师9 小时前
MySQL 索引条件下推是什么?Using index condition 并不是覆盖索引
sql·mysql
Wang's Blog9 小时前
PostgreSQL笔记38:慢查询定位与优化的系统方法论
数据库·笔记·postgresql
天涯明月19939 小时前
ray深度研究报告
大数据·人工智能·分布式·ray
幻风_huanfeng10 小时前
软考:高级软件架构师学习笔记----数据库
数据库·软考·系统架构师