我是靠谱客的博主 活力战斗机,最近开发中收集的这篇文章主要介绍clickhouse查询语法--withwith,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

with

clickhouse支持CTE(Common Table Expression,公共表达式),以增强查询语句的表达

select pow(2,3);
//pow是计算次方值函数
┌─pow(2, 3)─┐
│
8 │
└───────────┘
select pow(pow(2,2),2);
┌─pow(pow(2, 2), 2)─┐
│
16 │
└───────────────────┘

改用CTE的形式后,可以极大地提高语句的可读性和可维护性。

with pow(2,2) as res select pow(res,2);
┌─pow(res, 2)─┐
│
16 │
└─────────────┘

1)定义变量

with 1 as num select num+1;
┌─plus(num, 1)─┐
│
2 │
└──────────────┘
select * from
test_str;
┌─name─┬─job─┐
│ cxy
│ it
│
└──────┴─────┘
┌─name─────┬─job─┐
│ zhangsan │ DBA │
└──────────┴─────┘
with 'cxy' as n select * from test_str where name=n;
┌─name─┬─job─┐
│ cxy
│ it
│
└──────┴─────┘
with 'cxy' as a,'zhangsan' as b select * from test_str where name=a or name=b;
┌─name─┬─job─┐
│ cxy
│ it
│
└──────┴─────┘
┌─name─────┬─job─┐
│ zhangsan │ DBA │
└──────────┴─────┘

2)调用函数

select toYear(now());
┌─toYear(now())─┐
│
2021 │
└───────────────┘
with toYear(now()) as year select year;
┌─year─┐
│ 2021 │
└──────┘

3)子查询

可以定义子查询,但是一定还要注意的是,子查询只能返回一行结果,否则会输出异常,子查询返回的是元组类型的结果

with
(select * from tb_merge_tree where uid=1)
as res select res from tb_merge_tree;
//报错,因为子查询返回多行结果
with
(select * from tb_merge_tree_partition where uid=1)
as res select uid,name,res from tb_merge_tree_partition;
┌─uid─┬─name─┬─res────────────────────────────┐
│
3 │ ww
│ (1,'zs','2020-09-27 10:00:00') │
│
4 │ zl
│ (1,'zs','2020-09-27 10:00:00') │
│
13 │ www
│ (1,'zs','2020-09-27 10:00:00') │
│
14 │ zll
│ (1,'zs','2020-09-27 10:00:00') │
└─────┴──────┴────────────────────────────────┘
┌─uid─┬─name─┬─res────────────────────────────┐
│
1 │ zs
│ (1,'zs','2020-09-27 10:00:00') │
│
2 │ ls
│ (1,'zs','2020-09-27 10:00:00') │
│
11 │ zss
│ (1,'zs','2020-09-27 10:00:00') │
│
12 │ lss
│ (1,'zs','2020-09-27 10:00:00') │
└─────┴──────┴────────────────────────────────┘

4)with模型

create table tb_with(
id UInt8,
visit UInt8,
province String,
city String,
area String
)engine=MergeTree()
order by id;
insert into tb_with values(1,12,'山东','济南','历下');
insert into tb_with values(2,12,'山东','济南','历下');
insert into tb_with values(3,12,'山东','济南','天桥');
insert into tb_with values(4,12,'山东','济南','天桥');
insert into tb_with values(5,88,'山东','青岛','黄岛');
insert into tb_with values(6,88,'山东','青岛','黄岛');
insert into tb_with values(7,12,'山西','太原','小店');
insert into tb_with values(8,12,'山西','太原','小店');
insert into tb_with values(9,112,'山西','太原','尖草坪');
select * from tb_with;
┌─id─┬─visit─┬─province─┬─city─┬─area───┐
│
112 │ 山东
│ 济南 │ 历下
│
│
212 │ 山东
│ 济南 │ 历下
│
│
312 │ 山东
│ 济南 │ 天桥
│
│
412 │ 山东
│ 济南 │ 天桥
│
│
588 │ 山东
│ 青岛 │ 黄岛
│
│
688 │ 山东
│ 青岛 │ 黄岛
│
│
712 │ 山西
│ 太原 │ 小店
│
│
812 │ 山西
│ 太原 │ 小店
│
│
9112 │ 山西
│ 太原 │ 尖草坪
│
└────┴───────┴──────────┴──────┴────────┘
select province,city,area,sum(visit) from tb_with group by province,city,area;
┌─province─┬─city─┬─area───┬─sum(visit)─┐
│ 山东
│ 青岛 │ 黄岛
│
176
│
│ 山东
│ 济南 │ 天桥
│
24
│
│ 山西
│ 太原 │ 尖草坪 │
112
│
│ 山东
│ 济南 │ 历下
│
24
│
│ 山西
│ 太原 │ 小店
│
24
│
└──────────┴──────┴────────┴────────────┘
select province,city,area,sum(visit) from tb_with group by province,city,area with CUBE;
┌─province─┬─city─┬─area───┬─sum(visit)─┐
│ 山东
│ 青岛 │ 黄岛
│
176 │
│ 山东
│ 济南 │ 天桥
│
24 │
│ 山西
│ 太原 │ 尖草坪 │
112 │
│ 山东
│ 济南 │ 历下
│
24 │
│ 山西
│ 太原 │ 小店
│
24 │
└──────────┴──────┴────────┴────────────┘
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│ 山东
│ 青岛 │
│
176 │
│ 山东
│ 济南 │
│
48 │
│ 山西
│ 太原 │
│
136 │
└──────────┴──────┴──────┴────────────┘
┌─province─┬─city─┬─area───┬─sum(visit)─┐
│ 山东
│
│ 历下
│
24 │
│ 山东
│
│ 天桥
│
24 │
│ 山西
│
│ 尖草坪 │
112 │
│ 山西
│
│ 小店
│
24 │
│ 山东
│
│ 黄岛
│
176 │
└──────────┴──────┴────────┴────────────┘
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│ 山西
│
│
│
136 │
│ 山东
│
│
│
224 │
└──────────┴──────┴──────┴────────────┘
┌─province─┬─city─┬─area───┬─sum(visit)─┐
│
│ 济南 │ 历下
│
24 │
│
│ 济南 │ 天桥
│
24 │
│
│ 太原 │ 尖草坪 │
112 │
│
│ 青岛 │ 黄岛
│
176 │
│
│ 太原 │ 小店
│
24 │
└──────────┴──────┴────────┴────────────┘
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│
│ 青岛 │
│
176 │
│
│ 济南 │
│
48 │
│
│ 太原 │
│
136 │
└──────────┴──────┴──────┴────────────┘
┌─province─┬─city─┬─area───┬─sum(visit)─┐
│
│
│ 天桥
│
24 │
│
│
│ 小店
│
24 │
│
│
│ 黄岛
│
176 │
│
│
│ 历下
│
24 │
│
│
│ 尖草坪 │
112 │
└──────────┴──────┴────────┴────────────┘
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│
│
│
│
360 │
└──────────┴──────┴──────┴────────────┘
select province,city,area,sum(visit) from tb_with group by province,city,area with rollup;
┌─province─┬─city─┬─area───┬─sum(visit)─┐
│ 山东
│ 青岛 │ 黄岛
│
176 │
│ 山东
│ 济南 │ 天桥
│
24 │
│ 山西
│ 太原 │ 尖草坪 │
112 │
│ 山东
│ 济南 │ 历下
│
24 │
│ 山西
│ 太原 │ 小店
│
24 │
└──────────┴──────┴────────┴────────────┘
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│ 山东
│ 青岛 │
│
176 │
│ 山东
│ 济南 │
│
48 │
│ 山西
│ 太原 │
│
136 │
└──────────┴──────┴──────┴────────────┘
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│ 山西
│
│
│
136 │
│ 山东
│
│
│
224 │
└──────────┴──────┴──────┴────────────┘
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│
│
│
│
360 │
└──────────┴──────┴──────┴────────────┘
select province,city,area,sum(visit) from tb_with group by province,city,area with totals;
┌─province─┬─city─┬─area───┬─sum(visit)─┐
│ 山东
│ 青岛 │ 黄岛
│
176 │
│ 山东
│ 济南 │ 天桥
│
24 │
│ 山西
│ 太原 │ 尖草坪 │
112 │
│ 山东
│ 济南 │ 历下
│
24 │
│ 山西
│ 太原 │ 小店
│
24 │
└──────────┴──────┴────────┴────────────┘
Totals:
┌─province─┬─city─┬─area─┬─sum(visit)─┐
│
│
│
│
360 │
└──────────┴──────┴──────┴────────────┘

最后

以上就是活力战斗机为你收集整理的clickhouse查询语法--withwith的全部内容,希望文章能够帮你解决clickhouse查询语法--withwith所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部