描述

用户打车记录表tb_get_car_record

id uid city event_time end_time order_id
1 108 北京 2021-10-20 08:00:00 2021-10-20 08:00:40 9008
2 118 北京 2021-10-20 08:00:10 2021-10-20 08:00:45 9018
3 102 北京 2021-10-20 08:00:30 2021-10-20 08:00:50 9002
4 106 北京 2021-10-20 08:05:41 2021-10-20 08:06:00 9006
5 103 北京 2021-10-20 08:05:50 2021-10-20 08:07:10 9003
6 104 北京 2021-10-20 08:01:01 2021-10-20 08:01:20 9004
7 105 北京 2021-10-20 08:01:15 2021-10-20 08:01:30 9019
8 101 北京 2021-10-20 08:28:10 2021-10-20 08:30:00 9011

(uid-用户ID, city-城市, event_time-打车时间, end_time-打车结束时间, order_id-订单号)

打车订单表tb_get_car_order

id order_id uid driver_id order_time start_time finish_time mileage fare grade
1 9008 108 204 2021-10-20 08:00:40 2021-10-20 08:03:00 2021-10-20 08:31:00 13.2 38 4
2 9018 108 214 2021-10-20 08:00:45 2021-10-20 08:04:50 2021-10-20 08:21:00 14 38 5
3 9002 102 202 2021-10-20 08:00:50 2021-10-20 08:06:00 2021-10-20 08:31:00 10 41.5 5
4 9006 106 206 2021-10-20 08:06:00 2021-10-20 08:09:00 2021-10-20 08:31:00 8 25.5 4
5 9003 103 203 2021-10-20 08:07:10 2021-10-20 08:15:00 2021-10-20 08:31:00 11 41.5 4
6 9004 104 204 2021-10-20 08:01:20 2021-10-20 08:13:00 2021-10-20 08:31:00 7.5 22 4
7 9019 105 205 2021-10-20 08:01:30 2021-10-20 08:11:00 2021-10-20 08:51:00 10 39 4
8 9011 101 211 2021-10-20 08:30:00 2021-10-20 08:31:00 2021-10-20 08:54:00 10 35 5

(order_id-订单号, uid-用户ID, driver_id-司机ID, order_time-接单时间, start_time-开始计费的上车时间, finish_time-订单完成时间, mileage-行驶里程数, fare-费用, grade-评分)

场景逻辑说明

  • 用户提交打车请求后,在用户打车记录表生成一条打车记录,订单号-order_id设为null

  • 当有司机接单时,在打车订单表生成一条订单,填充接单时间-order_time及其左边的字段,上车时间及其右边的字段全部为null,并把订单号和接单时间(打车结束时间)写入打车记录表;若一直无司机接单、超时或中途用户主动取消打车,则记录打车结束时间。

  • 若乘客上车前,乘客或司机点击取消订单,会将打车订单表对应订单的订单完成时间-finish_time填充为取消时间,其余字段设为null

  • 当司机接上乘客时,填充打车订单表中该订单的上车时间start_time

  • 当订单完成时填充订单完成时间、里程数、费用;评分设为null,在用户给司机打1~5星评价后填充。

问题:请统计各个城市在2021年10月期间,单日中最大的同时等车人数。

:   等车指从开始打车起,直到取消打车、取消等待或上车前的这段时间里用户的状态。

如果同一时刻有人停止等车,有人开始等车,等车人数记作先增加后减少。

结果按各城市最大等车人数升序排序,相同时按城市升序排序。

输出示例

示例结果如下

city max_wait_uv
北京 5

解释:由打车订单表可以得知北京2021年10月20日有8条打车记录,108号乘客从08:00:00等到08:03:00,118号乘客从08:00:10等到08:04:50....,由此得知08:02:00秒时刻,共有5人在等车。

题解:

步骤一:用户开始打车则记为1,当司机接上乘客时,就会有上车时间start_time,这时候记为-1

-- 打车就为1,打到车了就为-1
select city,event_time dt,1 as diff   -- 这里要看每一天的不同时刻,所以不date(event_time)
from tb_get_car_record
where date_format(event_time,'%Y-%m')='2021-10'
union all
select city, start_time dt, -1 as wait_uv
FROM tb_get_car_record
LEFT JOIN tb_get_car_order USING(order_id)
where date_format(event_time,'%Y-%m')='2021-10'

步骤二: 每天同时等车的最大人数(先增加后减少:order by dt ,diff desc)

select city,date(dt) dt,
sum(diff) over(partition by city,date(dt) order by dt ,diff desc) uv-- 单日中、同时等车的、最大人数.order by diff是因为题目要求等车人数先增加后减少
from(-- 打车就为1,打到车了就为-1select city,event_time dt,1 as diff   -- 这里要看每一天的不同时刻,所以不date(event_time)from tb_get_car_recordwhere date_format(event_time,'%Y-%m')='2021-10'union allselect city, start_time dt, -1 as wait_uvFROM tb_get_car_recordLEFT JOIN tb_get_car_order USING(order_id)where date_format(event_time,'%Y-%m')='2021-10')t1

步骤三:单日中最大的同时等车人数。

select city,max(uv) max_wait_uv
from(select city,date(dt) dt,sum(diff) over(partition by city,date(dt) order by dt ,diff desc) uv-- 单日中、同时等车的、最大人数.order by diff是因为题目要求等车人数先增加后减少from(-- 打车就为1,打到车了就为-1select city,event_time dt,1 as diff   -- 这里要看每一天的不同时刻,所以不date(event_time)from tb_get_car_recordwhere date_format(event_time,'%Y-%m')='2021-10'union allselect city, start_time dt, -1 as wait_uvFROM tb_get_car_recordLEFT JOIN tb_get_car_order USING(order_id)where date_format(event_time,'%Y-%m')='2021-10')t1
)t2
group by city,dt
order by max_wait_uv,city;

牛客网 SQL24 各城市最大同时等车人数(困难类题目)相关推荐

  1. 牛客网在线编程专题《剑指offer-面试题39:题目二》判断是否是平衡二叉树

    题目链接: https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId=13&tqId=11192& ...

  2. SQL日常练习2-进阶篇-牛客网

    本文章目的: 在于对SQL系统化学习后,进行: 1,日常练习,巩固基础: 2,加深对SQL知识: 3,总结SQL相关知识体系: 4,或者某有朝一日能快速捡起相关SQL知识. 5,同时结尾附带有KES数 ...

  3. 牛客网【每日一题】4月14日题目精讲 Xorto

    文章目录 题目描述 题解: 代码: 扩展 传送 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format:%lld 题目描述 ...

  4. 牛客网--华为机试在线训练10:字符个数统计

    牛客网–华为机试在线训练10:字符个数统计 题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127).不在范围内的不作统计. 输入描述: 输入N个字符,字符在A ...

  5. 牛客网–华为机试在线训练8:合并表记录

    牛客网–华为机试在线训练8:合并表记录 题目描述 数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出. 输入描述: 先输入键值对的个 ...

  6. 牛客网–华为机试在线训练5:进制转换

    牛客网–华为机试在线训练5:进制转换 题目描述 写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串.(多组同时输入 ) 输入描述: 输入一个十六进制的数值字符串. 输出描述: 输出该 ...

  7. 【To Debug】牛客网--华为机试在线训练3:明明的随机数

    牛客网–华为机试在线训练3:明明的随机数 题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字, ...

  8. 牛客网--华为机试在线训练2:计算字符个数

    牛客网–华为机试在线训练2:计算字符个数 题目描述 写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数.不区分大小写. 输入描述: 输入一个有字母 ...

  9. 牛客网SQL大厂面试真题(一)

    SQL1 各个视频的平均完播率 SELECT log.video_id, ROUND(SUM(IF(TIMESTAMPDIFF(SECOND, log.start_time, log.end_time ...

最新文章

  1. ASP.NET中如何实现负载均衡
  2. 《系统集成项目管理工程师》必背100个知识点-70合同索赔流程
  3. cad工具箱详细讲解_2019CAD教程讲解 插件工具箱,从安装到应用整个过程,手把手教你...
  4. 海马苹果助手ipad版_iOS逆向-ipa包重签名及非越狱手机安装多个微信!
  5. 如何进行聚类可视化_如何使用matplotlib包进行数据可视化
  6. C语言入门经典题目及其答案
  7. java小程序查看器,成功拿到offer
  8. java define_Java Long类的define()方法与示例
  9. C 语言结构体成员赋值的深拷贝和浅拷贝
  10. 011-你觉得自动化测试有什么意义,都需要做些什么
  11. 数据统计分析(SPSS)【6】
  12. 数理统计实(试)验—双因素方差分析(有交互作用)excel操作分析方差分析表怎么看?
  13. SkeyeLive同屏直播库库功能介绍和接口说明与调用
  14. openwrt 挂载硬盘NFS共享,非SMB共享
  15. 魔兽在副本里服务器维护了,魔兽世界11月19日维护服务器状态查询地址 6.2.3补丁上线更新一览...
  16. python将两个csv文件按列合并
  17. 我的mybatis-plus用法,被全公司同事开始悄悄模仿了
  18. 将私人对话发布到公共空间来寻求正义是否可取
  19. EXCEL表格 显示 超长 数字 E+ 变成 文本格式,数字全部显示
  20. 概率论与数理统计(3.4) 相互独立的随机变量

热门文章

  1. 京东健康2021年报:年活跃用户数增3356万 日均在线咨询量超19万
  2. 【数学】C019_LC_三锥形的表面积(减重叠面积)
  3. 鸿蒙系统 麒麟系统什么关系,华为传来新消息!事情关系到Mate40系列手机
  4. i.MX6ULL终结者Jtag调试搭建开发环境
  5. i.MX6ULL终结者虚拟机VMware的安装
  6. 分享个超次元大海战辅助脚本,快速升级刷副本捞船
  7. 自动内存管理(gc),新的思路
  8. 如何搭建团队知识库?试试这款开源项目
  9. 又想骗我送快递?顺丰总裁王卫自掏腰包5亿元发红包,每位员工888元!
  10. ios 查找朋友 android,在 iOS 12 或更低版本中设置和使用“查找我的朋友”