题解 | #工作日各时段叫车量、等待接单时间和调度时间#

工作日各时段叫车量、等待接单时间和调度时间

http://www.nowcoder.com/practice/34f88f6d6dc549f6bc732eb2128aa338

此题共包含两张表:

表1:tb_get_car_record

表2:tb_get_car_order

要解决的问题:

统计周一到周五各时段的叫车量、平均等待接单时间和平均调度时间。全部以event_time-开始打车时间为时段划分依据,平均等待接单时间和平均调度时间均保留1位小数,平均调度时间仅计算完成了的订单,结果按叫车量升序排序。

解释:订单9017打车开始于11点整,属于工作时间,等待时间30秒,调度时间为1分40秒,示例数据中工作时间打车订单就一个,平均等待时间0.5分钟,平均调度时间1.7分钟。

解题思路:

  1. 统计各时段的叫车量、等待接单时间(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. 统计每个时间段的订单个数,筛选出叫车时间为周一~周五的订单
  2. 平均值保留1位小数,按叫车辆升序排序

知识点:

  1. 某日期是星期几:date_format(event_time,'%W')
  2. TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2),这个函数默认取整。如果其中一个是参数是date,另一个参数的时间部分会默认为0

alt

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
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务