题解 | #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:53
门头沟学院 Java
投递华为等公司10个岗位 >
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
八极星:我看成了化身一团黑子哈哈哈😂
点赞 评论 收藏
分享
22 1 评论
分享
牛客网
牛客企业服务