前言
clickhouse的强大之处在于充分利用内存计算的高效性从而快速得到计算结果,尤其是对于一些需要做聚合分析、统计等场景下,clickhouse提供了一些按维度分析的函数,本文将介绍clickhouse常用的几类多维分析函数。
groupby函数
还记得在mysql中,使用sql语句进行groupby的场景吧,即对查询结果按照某个字段,或者多个字段进行分组汇聚,具有相同业务场景的数据被分到同一个组中;
在clickhouse中,也提供了groupby的功能,不过clickhouse的groupby提供了更丰富的视角,即维度对查询结果进行分组,主要包括:
- with rollup【上卷】;
- with cube【多维分析】;
- with total【统计总数】;
rollup
rollup也叫上卷,举例来说,在A表中,其中有a,b两个字段,根据字段的有序性进行group by,比如像下面这样,那么在clickhouse中即成为上卷;
group by a
group by a,b
cube
rollup也叫多维分析,仍然以A表为例,group by的字段如果进行排列组合可以得出很多种结果,比如:
group by a
group by a,b
group by b
group by b,a
案例实操
1、创建一张数据表
create table t_order_mt1(
id UInt32,
sku_id String,
total_amount Decimal(16,2),
create_time Datetime
) engine =MergeTree
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);
2、插入一批数据
insert into t_order_mt1 values
(101,'sku_001',1000.00,'2022-09-01 12:00:00'),
(101,'sku_002',2000.00,'2022-09-01 12:00:00'),
(103,'sku_004',2500.00,'2022-09-01 12:00:00'),
(104,'sku_002',2000.00,'2022-09-01 12:00:00'),
(105,'sku_003',600.00,'2022-09-02 12:00:00'),
(106,'sku_001',1000.00,'2022-09-04 12:00:00'),
(107,'sku_002',2000.00,'2022-09-04 12:00:00'),
(108,'sku_004',2500.00,'2022-09-04 12:00:00'),
(109,'sku_002',2000.00,'2022-09-04 12:00:00'),
(110,'sku_003',600.00,'2022-09-01 12:00:00');
3、使用从右至左去掉维度进行小计
select id , sku_id,sum(total_amount) from t_order_mt1 group by id,sku_id with rollup
4、从右至左去掉维度进行小计,再从左至右去掉维度进行小计
select id , sku_id,sum(total_amount) from t_order_mt group by id,sku_id with cube;
从展示的结果来看,即按照id和sku_id两个字段的不同的组合,得到了各种组合下的统计结果
5、with totals: 只计算合计
select id , sku_id,sum(total_amount) from t_order_mt group by id,sku_id with totals;