目录
0 问题场景
1 数据准备
2 问题分析
2.1 需求一
2.2需求二
3 小结
想要进一步了解SQL这门艺术语言的,可以订阅我的专栏数字化建设通关指南,将在该专栏进行详细解析。
专栏 原价99,现在活动价39.9,按照阶梯式增长,还差3个名额将上升至59.9,直到恢复原价。
数字化建设通关指南
0 问题场景
有两张表,一张用户下单表user_purchase(用户ID粒度)包含用户ID、订单ID和下单消耗金额和一张用户维表user_info包含用户ID、用户年龄和用户是否实名认证。
user_purchase
user_info
需求一
-
我想取出所有认证过的用户,如果用户没有认证过,就取出年龄大于18岁的用户
需求二
-
在user_purchase的基础上加上用户年龄字段,但是user_purchase中存在用户ID大量为null的情况,和user_info关联的话会产生数据倾斜,需要做一下倾斜处理
1 数据准备
create table user_purchase as
(
select stack(
4,
1001,1,20,
1002,2,10,
1003,3,40,
null,4,40
) as(user_id,order_id,amount)
);
create table user_info as
(
select stack(
3,
1001,25,1,
1002,30,1,
1003,18,0
) as(user_id,age,is_certified)
);
2 问题分析
2.1 需求一
-
一般写法:可以按照是否认证过分成两个条件用或逻辑取出想要的数据
select
*
from user_info
where is_certified=1 or (is_certified=0 and age > 18)
- 优雅写法
使用if函数:如果认证过所有数据记录都是满足条件的,如果没有认证过要继续判断一下年龄是否满足大于18岁。这种写法更加易读简洁
select
user_id
,age
,is_certified
from user_info
where if(is_certified=1, 1=1, age > 18)
2.2需求二
-
一般写法:在关联之前提前处理user_purchase中的user_id的null
select
a.user_id
,a.order_id
,a.amount
,b.age
from
(
select
if(user_id is null, concat('user_', FLOOR(100 * RAND())), user_id) as user_id_process
,user_id
,order_id
,amount
from user_purchase
) a
left join
(
select
user_id
,age
,is_certified
from user_info
) b on a.user_id_process=b.user_id
- 优雅写法
使用if函数:在关联的时候对user_purchase中为null的user_id做处理
select
a.user_id
,a.order_id
,a.amount
,b.age
from
(
select
user_id
,order_id
,amount
from user_purchase
) a
left join
(
select
user_id
,age
,is_certified
from user_info
) b on if(a.user_id is null, concat('user_', FLOOR(100 * RAND())), a.user_id)=b.user_id
3 小结
数仓开发中if函数是最最常用的函数之一,我们一般都是在select之后或者聚合函数中高频使用,在其他关键字后面使用较少。特定场景在where和join条件中使用if函数,还是相当优雅的
想要进一步了解SQL这门艺术语言的,可以订阅我的专栏数字化建设通关指南,将在该专栏进行详细解析。
专栏 原价99,现在活动价39.9,按照阶梯式增长,还差3个名额将上升至59.9,直到恢复原价。
数字化建设通关指南
主要内容:
(1)SQL进阶实战技巧
可以参考如下教程,具体链接如下
SQL很简单,可你却写不好?也许这才是SQL最好的教程
上面链接中的文章及技巧会不定期更新。
(2)数仓建模实战技巧和个人心得
1)新人入职新公司后应如何快速了解业务?
2)以业务视角看宽表化建设?
3) 维度建模 or 关系型建模?
4)业务模型与数据模型有什么区别?业务阶段的模型该如何建设?
5)业务指标体系该如何建设?指标体系该如何维护?指标平台应如何建设?指标体系 该由谁来搭建?
6)如何优雅设计DWS层?DWS层模型好坏该如何评价?
7)指标发生异常,该如何排查?应从哪些方面入手寻找问题点?
8) 数据架构的选择,mpp or hadoop?
9)数仓团队应如何体现自己的业务价值,讲好数据故事?
10)BI与大数据有什么关系?BI与信息化、数字化之间有什么关系?BI与报表之间的关 系?
11)数据部门如何与业务部门沟通,并规划指引业务需求?
文章不限于以上内容,有新的想法也会及时更新到该专栏。
具体专栏链接如下:
数字化建设通关指南_莫叫石榴姐的博客-CSDN博客