明确题意

  • 统计周一到周五各时段的叫车量平均等待接单时间平均调度时间
  • event_time-开始打车时间为时段划分依据
  • 平均等待接单时间和平均调度时间均保留1位小数
  • 结果按叫车量升序排序

问题拆解

1. 将表 tb_get_car_record 和 tb_get_car 根据 order_id 连接起来得到子表 tb
  • 筛选工作日的叫车: WHERE DATE_FORMAT(event_time,'%W') NOT IN ( 'Saturday' ,'Sunday')
  • event_time 时间进行格式化,得到各时间的划分结果:CASE when...
  • 计算等待接单时间:TIMESTAMPDIFF(SECOND,event_time,order_time)/60
  • 计算调度时间:TIMESTAMPDIFF(SECOND,order_time,start_time)/60
2. 根据表 tb 计算工作日各时段叫车量、平均等待接单时间和平均调度时间
  • 按时段分组:GROUP BY period
  • 计算叫车量:COUNT(*) as get_car_num
  • 计算平均等待接单时间:AVG(wait_time)  avg_wait_time
  • 计算平均调度时间:AVG(dispatch_time)  avg_dispatch_time
  • 保留1位小数:ROUND(x, 1)
3. 结果按叫车量升序排序: ORDER BY get_car_num

代码

 SELECT 
	period,
    COUNT(*) get_car_num,
    ROUND(AVG(wait_time),1) avg_wait_time,
    ROUND(AVG(dispatch_time),1) avg_dispatch_time
 FROM (
	   SELECT 
	        CASE WHEN DATE_FORMAT(event_time,'%H-%i-%s') >= '07-00-00' AND DATE_FORMAT(event_time,'%H-%i-%s') < '09-00-00' THEN '早高峰'
		      WHEN DATE_FORMAT(event_time,'%H-%i-%s') >= '09-00-00' AND DATE_FORMAT(event_time,'%H-%i-%s') < '17-00-00' THEN '工作时间'
		      WHEN DATE_FORMAT(event_time,'%H-%i-%s') >= '17-00-00' AND DATE_FORMAT(event_time,'%H-%i-%s') < '20-00-00' THEN '晚高峰'
		      ELSE '休息时间'
		      END period,
		TIMESTAMPDIFF(SECOND,event_time,order_time)/60 wait_time,
		TIMESTAMPDIFF(SECOND,order_time,start_time)/60 dispatch_time,
		DATE_FORMAT(event_time,'%W') work_days
	 FROM tb_get_car_record gcr
	 LEFT JOIN tb_get_car_order gco
	 ON gcr.order_id=gco.order_id
	 WHERE DATE_FORMAT(event_time,'%W') NOT IN ( 'Saturday' ,'Sunday')
 ) tb
 GROUP BY period
 ORDER BY get_car_num