目录
2、提取2020年8月各城市每天的司机数,快车订单量和快车流水数据
3、 提取2020年8月和9月,每个月的北京市新老司机(首单日期在当月为新司机)的司机数、在线时长和TPH(订单量/在线时长)数据。
4、分别提取司机数大于20,司机总在线时长大于2小时,订单量大于1,乘客数大于1的城市名称数据。
一、题目
公司A是的app(类似滴滴、uber)为用户提供打车服务。现有四张表,分别是“司机数据”表,“订单数据”表,“在线时长数据”表,“城市匹配数据”表。业务问题:
1. 提取2020年8月各城市每天的司机数、快车订单量和快车流水数据。
2. 提取2020年8月和9月,每个月的北京市新老司机(首单日期在当月为新司机)的司机数、在线时长和TPH(订单量/在线时长)数据。
3. 分别提取司机数大于20,司机总在线时长大于2小时,订单量大于1,乘客数大于1的城市名称数据。
二、步骤
1、数据类型转化
通过观察数据库表结构可知,关于时间的存储类型是varchar,但是需要提取到月份,所以需要将时间列的类型转换成date的特定的格式(数据中涉及多个时间)
update 司机数据
set 日期=date_format(日期,'%Y-%m-%d');
2、提取2020年8月各城市每天的司机数,快车订单量和快车流水数据
①2020年8月各城市每天的司机数
根据题目意思以及表结构,需要将城市匹配数据与司机数据两张表进行连接,连接的条件是司机id相等
一个限制条件——2020年8月,也就是司机数据表的日期在2020-08-01到2020-08-31范围之内
一个聚合——对司机数据表中的司机id进行聚合count()
两个分组——8月各城市,也就是8月的每天以及每个城市的情况,所以需要对日期以及城市id进行分组
select b.`城市名称`,a.`日期`,COUNT(司机id) as '司机数'from
`司机数据` as a left join `城市匹配数据` as b
on a.`城市id`=b.`城市id`
where a.`日期` between '2020-08-01' and '2020-08-31'
group by a.`城市id`,a.`日期`
②快车订单量和快车流水数据
在四个表中,只有订单数据中含有快车数据,但是表中没有城市id和司机id,所以需要跟其他表进行关联才能得到结果
两个限制条件——一个是时间上的限制,一个就是订单的类型
两个聚合——一个是订单量,一个是流水数据
订单量也就是对产品线id的求个数和
流水数据是对表中流水的求和
两个分组——8月各城市,也就是8月的每天以及每个城市的情况,所以需要对日期以及城市id进行分组
select c.`城市名称`,a.`日期`,COUNT(a.`产品线id`) as '快车订单量',SUM(a.`流水`) as '快车流水数据' from
`订单数据` as a left join `司机数据` as b
on a.`司机id`=b.`司机id`
left join `城市匹配数据` as c
on b.`城市id` = c.`城市id`
where a.`日期` between '2020-08-01' and '2020-08-31' and a.`产品线id`=3
GROUP BY c.`城市id`,b.`日期`
③小结
前两步已经分别求出了想要的数据,但是因为判断条件的原因,不能将两张表给联合起来,所以只能将两个表作为子表,然后再去查子表得到数据