一、思路:要计算单日最大等车人数关键在于 选出等车人数发生变化的时刻去计算当时的人数,其他任一时刻等车人数都不会变化,不用管。
1、先按天分组,在每一天的分组里去计算每一个人数增减变化时刻的等车人数
(人数增减变化的时刻无非是:下单时刻、司机接单前取消时刻、司机接单后不上车的取消时刻、司机接单后上车时刻);
2、把这些订单状态变化的时刻打上标签,下单时刻会让人数增加记为1,其他三个时刻人数会减少记为-1,用union all联立后可以聚合运算;

二、步骤:
①先准备一张数据底表tb1方便取数(个人习惯):把两表连接,取出人数增减变化的时刻,下单时刻event_time记为1,终止等待的时刻记为-1,该列记为diff(这里用if判断一下什么时候用end_time,什么时候用finish_time或者start_time);
②从tb1中选出city、时刻、diff这三列,用union all联立,形成tb2;
③针对tb2用窗口函数sum()over()对±1那列进行逐行累加,这样每一个时刻对应的等车人数就计算出来了。这里注意over里要用城市+天分组、并用时刻正序+diff降序排列(题中说了同一时刻有进有出 记为 先进后出),此时形成tb3。
④最后对tb3进行城市分组,选出最大值即可。

with tb1 as(
select city, event_time, 1 as a, 
case when order_id is null then end_time
when start_time	is null then finish_time
else start_time end as out_time,
-1 as b
from tb_get_car_record left join tb_get_car_order using(order_id)
where date_format(event_time,'%Y%m')='202110')

select city, max(wait_uv) as max_wait_uv
from(
select city, date(dt), dt, 
sum(diff)over(partition by city, date(dt) order by dt, diff desc) as wait_uv
from(
select city, event_time as dt, a as diff from tb1
union all
select city, out_time as dt, b as diff from tb1
) as tb2
) as tb3
group by city
order by max_wait_uv, city