【Databend】分组集:教你如何快速分组汇总

简介: 【Databend】分组集:教你如何快速分组汇总

分组集定义和数据准备

分组集是多个分组的并集,用于在一个查询中,按照不同的分组列对集合进行聚合运算,等价于对单个分组使用"union all",计算多个结果集的并集。

Databend 常见的分组集有三种 grouping sets 、rollup 、cube 。

数据准备

drop table if exists sales_data;
create table if not exists sales_data (
  region varchar(255),
  product varchar(255),
  sales_amount int
);
insert into sales_data (region, product, sales_amount) values
  ('North', 'WidgetA', 200),
  ('North', 'WidgetB', 300),
  ('South', 'WidgetA', 400),
  ('South', 'WidgetB', 100),
  ('West', 'WidgetA', 300),
  ('West', 'WidgetB', 200);

group by grouping sets

group by grouping sets 是 group by 子句的强大扩展,允许在单个语句中计算多个 group by子句,组集是一组维度列。效果等同于同一结果集中两个或多个 group by 操作的 union all:

  • group by grouping sets((a))等同于单分组集操作 group by a。
  • group by grouping sets((a),(a,b))等同于 group by a union all group by a,b。

基础语法:

select ...
from ...
[ ... ]
group by grouping sets ( groupset [ , groupset [ , ... ] ] )
[ ... ]
-- groupset ::= { <column_alias> | <position> | <expr> }

其中,column_alias 表示列的别名,position 表示 select 中列的位置,expr 表示当前范围内表上的任何表达式。

根据准备的数据,需求是统计区域销量和产品销量。

-- 方法一:使用 group by grouping sets 语法
select region
     , product
     , sum(sales_amount) as total_sales
from sales_data
group by grouping sets(region, product)
order by region, product;
-- 方法二:使用 union all
select region
     ,null as product
     , sum(sales_amount) as total_sales
from sales_data
group by region
union all 
select null as region
     , product
     , sum(sales_amount) as total_sales
from sales_data
group by product;

根据准备的数据,需求是在原数据的基础上,统计区域销量和产品销量。

select region
     , product
     , sum(sales_amount) as total_sales
from sales_data
group by grouping sets(region, product,(region, product))
order by region, product;

group by rollup

group by rollup 子句会在分组的基础上产生小计行以及总计行,语法如下:

select ...
from ...
[ ... ]
group by rollup ( grouprollup [ , grouprollup [ , ... ] ] )
[ ... ]
-- grouprollup ::= { <column_alias> | <position> | <expr> }

其中,column_alias 表示列的别名,position 表示 select 中列的位置,expr 表示当前范围内表上的任何表达式。

根据准备的数据,需求是在原数据的基础上,统计区域下产品销量小计和总计数据。

-- 方法一:使用 group by rollup 语法
select region
     , product
     , sum(sales_amount) as total_sales
from sales_data
group by rollup(region, product)
order by region, product;
-- 方法二:union all
select region
     , product
     , sum(sales_amount) as total_sales
from sales_data
group by region,product
union all
select region
     ,null as product
     , sum(sales_amount) as total_sales
from sales_data
group by region
union all 
select null as region
     , null as product
     , sum(sales_amount) as total_sales
from sales_data
order by region, product;

这种汇总方式在分析看板里经常看到,比如 Power BI 和 Tableau 中做表格时,可以选择小计和总计。可以看到使用 group by rollup 子句能快速实现汇总,代码也简洁。

group by cube

group by cube 子句类似 group by rollup 子句,除了生成 group by rollup 子句的所有行外,还会多一些维度,对所有列交叉分组汇总。

select ...
from ...
[ ... ]
group by cube ( groupcube [ , groupcube [ , ... ] ] )
[ ... ]
-- groupcube ::= { <column_alias> | <position> | <expr> }

其中,column_alias 表示列的别名,position 表示 select 中列的位置,expr 表示当前范围内表上的任何表达式。

根据准备的数据,需求是在原数据基础上分析所有可能情况的销售汇总。

-- 方法一:使用 group by cube 语法
select region
     , product
     , sum(sales_amount) as total_sales
from sales_data
group by cube(region, product)
order by region, product;
-- 方法二:使用 group by grouping sets 子句和 union all 结合
select region
     , product
     , sum(sales_amount) as total_sales
from sales_data
group by grouping sets(region, product,(region, product))
union all
select null as region
     , null as product
     , sum(sales_amount) as total_sales
from sales_data
order by region, product;

总结

Databend 中 grouping sets、rollup、cube 都是对 group by 的扩展,相对于 union all 来看,代码较简洁,效率也高,可以试着在实际工作中多用用,如果不支持或者理不清,使用 union all 实现的效果也是一样的。

参考资料:

相关文章
|
Java 编译器 数据库连接
Cause java.sql.SQLDataException Unsupported conversion from LONG to java.sql.Timestamp
Cause java.sql.SQLDataException Unsupported conversion from LONG to java.sql.Timestamp
1528 0
|
监控 负载均衡 网络协议
OSPF的性能优化策略
OSPF的性能优化策略
443 3
|
11月前
|
人工智能 搜索推荐
AI视频技术的发展是否会影响原创内容的价值
AI视频技术的发展显著降低了视频制作的门槛与成本,自动完成剪辑、特效添加等繁琐工作,大大缩短创作时间。它提供个性化创意建议,帮助创作者突破传统思维,拓展创意边界。此外,AI技术使更多非专业人士也能参与视频创作,注入新活力与多样性,丰富了原创内容。总体而言,AI视频技术不仅提升了创作效率,还促进了视频内容的创新与多样化。
|
人工智能 算法 安全
探索量子计算:从基础原理到未来应用
探索量子计算:从基础原理到未来应用
|
自然语言处理 API Python
BERT
【11月更文挑战第18天】
766 6
|
关系型数据库 Go 数据处理
高效数据迁移:使用Go语言优化ETL流程
在本文中,我们将探索Go语言在处理大规模数据迁移任务中的独特优势,以及如何通过Go语言的并发特性来优化数据提取、转换和加载(ETL)流程。不同于其他摘要,本文不仅展示了Go语言在ETL过程中的应用,还提供了实用的代码示例和性能对比分析。
|
前端开发 JavaScript 应用服务中间件
WEB前端有必要学会docker吗?0基础-45分钟带你学会(包含视频笔记案例源代码)
WEB前端有必要学会docker吗?0基础-45分钟带你学会(包含视频笔记案例源代码)
238 0
|
移动开发 前端开发 JavaScript
HTML5新增元素之Canvas-实现太极八卦图和扇子
HTML5新增元素之Canvas-实现太极八卦图和扇子
|
JSON Rust API
【Rust 实战】抖音短视频解析工具
【Rust 实战】抖音短视频解析工具
3117 0
【Rust 实战】抖音短视频解析工具