题解 | #各城市最大同时等车人数#
各城市最大同时等车人数
https://www.nowcoder.com/practice/f301eccab83c42ab8dab80f28a1eef98
这题很多题解没有考虑到题目说结束的三种情况,只是牛客的用例少,导致能通过。
拿到这个题目,一看就是那种计算同时在线的题目,那么就需要找到每个人的进入时间和出去时间,在本题的场景内是打车时间-取消打车|取消等待|上车时间
打车时间就是event_time这个没有什么疑问。
然后结束时间有三种情况:
1. 用户上车了:start_time不为空
2. 用户打到车了,但是上车前却取消了:start_time为空,finish_time不为空
3. 用户没达到车,订单被取消了:finish_time为空,end_time不为空
所以 我们可以连利这三种
IFNULL(start_time, ifnull(finish_time, end_time))
本题还有一个易错点,也是我做的时间搞错的,就是窗口函数在order by的时候一定要加上 flag desc(别看union的时候你是按顺序union的,但是在窗口函数的使用的时候order by语句已经把东西按日期整理了新顺序,先减后加这会导致错误的结果)
with temp as ( select city, event_time, order_id, 1 flag from tb_get_car_record union all select city, IFNULL(start_time, ifnull(finish_time, end_time)) event_time, t1.order_id, -1 flag from tb_get_car_record t1 left join tb_get_car_order t2 on t1.order_id = t2.order_id ) select city, max(累积) max_wait_uv from ( select city, event_time, flag, sum(flag) over(partition by city, DATE(event_time) order by event_time, flag DESC) 累积 from temp where DATE_FORMAT(event_time, '%Y-%m')='2021-10' ) a group by city order by max_wait_uv, city