题源来源与网络
你将斩获:
- 练练手,找找感觉 & 需求理解力
- 多表连接(事实表 + 维度表 + 维度表)
- 多对一:主表为事实表,待连接的表为维度表,left join,inner join 都可以;
- 锁定统计所需要的数据表和字段(绘制E-R图)【E-R图如何绘制,可以去百度 Workbeach 】
简单点一下:
1.遇到多表关联的情况时,梳理清楚表与表之间的关系(建议E-R图),你就完成了一半的工作量;
2.磨刀不误看柴工
3.一定要注意避免多对多的关系
4.在进行表连接的时候,一定具备空间建构能力(空间逻辑想象力)
开局一张图:
需求:
分别提取司机数大于20,司机总在线时长大于2小时,订单量大于1,乘客数大于1的城市名称数据;
-- 典型的错误,标准的零分
select d.城市名称
,count(distinct c.司机id) 司机数
,sum(b.在线时长)
,count(a.订单id) 订单量
,count(a.乘客id) 乘客数
from 订单数据 a
inner join 在线时长数据 b on a.司机id = b.司机id
inner join 司机数据 c on a.司机id = c.司机id
inner join 城市匹配数据 d on c.城市id = d.城市id
group by d.城市名称;
-- 表之间的关联要尽量避免多对多,以上犯了经典的逻辑错误
① 司机数>20
-- ① 司机数>20
select a.城市id,城市名称,count(司机id) as num
from 司机数据 a left join 城市匹配数据 b on a.城市id = b.城市id
group by a.城市id,城市名称
having count(司机id)>20;
② 总在线时长数据 >2小时
-- ② 总在线时长数据 >2小时
select a.司机id
,总在线时长
,城市名称
from
(select 司机id,sum(在线时长) as 总在线时长
from 在线时长数据
group by 司机id
having sum(在线时长)>2)a
left join 司机数据 b on a.司机id = b.司机id
left join 城市匹配数据 c on c.城市id = b.城市id;
③订单量大于1
-- ③订单量大于1
select a.司机id,订单量,城市名称
from(select 司机id,count(订单id) as 订单量
from 订单数据
group by 司机id
having count(订单id)>1) a
left join 司机数据 b on a.司机id = b.司机id
left join 城市匹配数据 c on c.城市id = b.城市id;
④乘客数大于1
-- ④乘客数大于1
select a.司机id,乘客数,城市名称
from
(select 司机id,count(乘客id) as 乘客数
from 订单数据 group by 司机id having count(乘客id)>1)a
left join 司机数据 b on a.司机id = b.司机id
left join 城市匹配数据 c on c.城市id = b.城市id;
多对一:主表为事实表,待连接的表为维度表,left join,inner join 都可以;