# 这里可以先找出每一个订单的开始时间和结束时间,
# 然后将每个订单转变为两行数据,时间戳分别是开始时间和结束时间,并且还带上开始就是+1,结束就是-1,
# 然后按照时间顺序进行开窗sum计算,其中就会出现加减,那么必有一个最大值。
# 还有一个很重要的逻辑就是 结束时间的判断,这里应该是 先看乘车时间是否为空,如果不为就是结束等待时间,
# 如果乘车时间为空,那么再看finish_time是否为空,如果不是那就是结束时间,在最后才是end_time
with cte001 as (
    select t001.id,
       t001.city,
       event_time start_dt,
       if(start_time is not null ,start_time,if(finish_time is not null ,finish_time,end_time)) end_dt
from tb_get_car_record t001
left join  tb_get_car_order t002
    on t001.order_id = t002.order_id
    where date_format(event_time,'%Y-%m') = '2021-10'
    ),
cte002 as (
select id,
       city,
       start_dt as dt,
       1 as tag
from cte001
union all
select id,
       city,
       end_dt as dt,
       -1 as tag
from cte001
)
  ,
cte003 as (
    select city,
           dt,
           tag,
           sum(tag) over (partition by city,date_format(dt,'%Y-%m') order by dt rows unbounded preceding) cn
# sum(score) over (PARTITION by id order by score) as a2`:按照score排序,从起始行到当前行进行加总,与a3中的ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW不同的是,当score相同时,算相同排名,会一起加总。类似rank的概念。
# sum(score) over (PARTITION by id order by score ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)`:从起始行到当前行进行加总,与a2不同的是,当score相同时,排名不同,不会加总到当前行。类似row_number的概念。
    from cte002
)
select city,max(cn) as max_wait_uv
from cte003
group by city
order by max_wait_uv ;