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

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

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

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

明确题意:

统计周一到周五各时段的叫车量、平均等待接单时间和平均调度时间。

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


问题分解:

  • 计算每次叫车的等待时间和调度时间(生成子表t_wait_dispatch_time):
    • 关联打车记录和订单表:tb_get_car_record JOIN tb_get_car_order USING(order_id)
    • 筛选工作日的记录(周一到周五):WHERE DAYOFWEEK(event_time) BETWEEN 2 AND 6
    • 转换打车时间所属时段:CASE WHEN HOUR(event_time) IN (7, 8) THEN '早高峰' ... END as period
    • 计算等待接单时间:TIMESTAMPDIFF(SECOND, event_time, end_time) as wait_time
    • 计算调度时间:TIMESTAMPDIFF(SECOND, order_time, start_time) as dispatch_time
  • 按时段分组:GROUP BY period
  • 计算叫车量:COUNT(1) as get_car_num
  • 计算平均等待接单时间:AVG(wait_time/60) as avg_wait_time
  • 计算平均调度时间:AVG(dispatch_time/60) as avg_dispatch_time
  • 保留1位小数:ROUND(x, 1)

细节问题:

  • 表头重命名:as
  • 按叫车量升序排序:ORDER BY get_car_num

完整代码:

SELECT period, COUNT(1) as get_car_num,
    ROUND(AVG(wait_time/60), 1) as avg_wait_time,
    ROUND(AVG(dispatch_time/60), 1) as avg_dispatch_time
FROM (
    SELECT event_time,
        CASE
            WHEN HOUR(event_time) IN (7, 8) THEN '早高峰'
            WHEN HOUR(event_time) BETWEEN 9 AND 16 THEN '工作时间'
            WHEN HOUR(event_time) IN (17, 18, 19) THEN '晚高峰'
            ELSE '休息时间'
        END as period,
        TIMESTAMPDIFF(SECOND, event_time, end_time) as wait_time,
        TIMESTAMPDIFF(SECOND, order_time, start_time) as dispatch_time
    FROM tb_get_car_record
    JOIN tb_get_car_order USING(order_id)
    WHERE DAYOFWEEK(event_time) BETWEEN 2 AND 6
) as t_wait_dispatch_time
GROUP BY period
ORDER BY get_car_num;
SQL大厂真题 文章被收录于专栏

大厂真题手把手教你怎么解~

全部评论
用hour真大佬,超短!
3 回复 分享
发布于 2022-05-01 14:53
start_time为null 就是没有完成的订单,avg自动过滤了。
3 回复 分享
发布于 2022-12-21 10:48 北京
聚合函数AVG在计算过程中是不计算null值的
2 回复 分享
发布于 2023-03-18 00:36 四川
'平均调度时间仅计算完成了的订单'这个条件是否没有要求?
点赞 回复 分享
发布于 2022-03-01 23:29
采用内连接using(order_id)时,‘若一直无司机接单、超时或中途用户主动取消打车’这种情况下的叫车次数(感觉符合题目的统计要求,应该要统计进去的吧)就不会被统计了吧?
点赞 回复 分享
发布于 2022-04-14 22:52
请问平均调度时间仅计算完成了的订单这个限定条件如何表达?我在子句里加了where fare is not null 是属于平均等车时间和平均调度时间都仅计算完成了的订单,但是提交结果是错的,我去掉where fare is not null后才显示正确。可是这样不是没有表达'平均调度时间仅计算完成了的订单' 这个条件吗?求大佬解答。
点赞 回复 分享
发布于 2022-08-28 14:55 上海
2个问题:1.'平均调度时间仅计算完成了的订单'这个条件不严谨了 2. between 是双向闭区间,要求是左闭右开区间
点赞 回复 分享
发布于 2022-09-23 15:35 浙江

相关推荐

头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
22 1 评论
分享
牛客网
牛客企业服务