【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 实现的效果也是一样的。

参考资料:

相关文章
|
监控 负载均衡 网络协议
OSPF的性能优化策略
OSPF的性能优化策略
462 3
|
12月前
|
人工智能 搜索推荐
AI视频技术的发展是否会影响原创内容的价值
AI视频技术的发展显著降低了视频制作的门槛与成本,自动完成剪辑、特效添加等繁琐工作,大大缩短创作时间。它提供个性化创意建议,帮助创作者突破传统思维,拓展创意边界。此外,AI技术使更多非专业人士也能参与视频创作,注入新活力与多样性,丰富了原创内容。总体而言,AI视频技术不仅提升了创作效率,还促进了视频内容的创新与多样化。
|
人工智能 算法 安全
探索量子计算:从基础原理到未来应用
探索量子计算:从基础原理到未来应用
|
自然语言处理 API Python
BERT
【11月更文挑战第18天】
820 6
|
存储 JSON 数据格式
解密 parquet 文件,以及如何用 Python 去处理它(一)
解密 parquet 文件,以及如何用 Python 去处理它
2356 1
|
Rust Shell 开发者
7步开始rust(自定义环境安装与vscode开发环境配置)
本文档详细记录了当改变Rust安装路径至特定目录(如 `/home/local_rust`)时,如何在VSCode环境中正确配置Rust开发环境的过程。主要包括:设置环境变量、使用清华大学镜像安装Rust及更新镜像源、手动部署 `rust-analyzer`、安装标准库源码、安装与配置VSCode插件等七个步骤,确保开发者能够顺利搭建并使用定制化的Rust开发环境。
2169 0
|
数据可视化
Visio绘制时间轴、日程安排图、时间进度图的方法
Visio绘制时间轴、日程安排图、时间进度图的方法
778 1
|
移动开发 前端开发 JavaScript
HTML5新增元素之Canvas-实现太极八卦图和扇子
HTML5新增元素之Canvas-实现太极八卦图和扇子
|
JSON Rust API
【Rust 实战】抖音短视频解析工具
【Rust 实战】抖音短视频解析工具
3166 0
【Rust 实战】抖音短视频解析工具