此题共包含两张表:
表1:tb_get_car_record
表2:tb_get_car_order
要解决的问题:
统计周一到周五各时段的叫车量、平均等待接单时间和平均调度时间。全部以event_time-开始打车时间为时段划分依据,平均等待接单时间和平均调度时间均保留1位小数,平均调度时间仅计算完成了的订单,结果按叫车量升序排序。
解释:订单9017打车开始于11点整,属于工作时间,等待时间30秒,调度时间为1分40秒,示例数据中工作时间打车订单就一个,平均等待时间0.5分钟,平均调度时间1.7分钟。
解题思路:
- 统计各时段的叫车量、等待接单时间(event_time ~ order_time)、调度时间(order_time ~ start_time仅要完成了订单的)
- 早高峰 [07:00:00 , 09:00:00)、
- 工作时间 [09:00:00 , 17:00:00)、
- 晚高峰 [17:00:00 , 20:00:00)、
- 休息时间 [20:00:00 , 07:00:00)
- 统计每个时间段的订单个数,筛选出叫车时间为周一~周五的订单
- 平均值保留1位小数,按叫车辆升序排序
知识点:
- 某日期是星期几:date_format(event_time,'%W')
- TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2),这个函数默认取整。如果其中一个是参数是date,另一个参数的时间部分会默认为0
SELECT period,
count(*) get_car_num,
ROUND(avg(order_t),1)avg_wait_time,
ROUND(avg(start_t),1) avg_dispatch_time
from(
SELECT case when DATE_FORMAT(event_time,'%T') >= '07:00:00' and DATE_FORMAT(event_time,'%T') < '09:00:00' then '早高峰'
when DATE_FORMAT(event_time,'%T') >= '09:00:00' and DATE_FORMAT(event_time,'%T') < '17:00:00' then '工作时间'
when DATE_FORMAT(event_time,'%T') >= '17:00:00' and DATE_FORMAT(event_time,'%T') < '20:00:00' then '晚高峰'
else '休息时间'
end period,
timestampdiff(second,event_time, order_time)/60 order_t,
timestampdiff(second,order_time, start_time)/60 start_t
from tb_get_car_record join tb_get_car_order using(order_id)
where date_format(event_time,'%W') not in ('Saturday','Sunday')
) t1
GROUP BY period
ORDER BY get_car_num