题解 | #各城市最大同时等车人数#

各城市最大同时等车人数

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

全部评论

相关推荐

听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务