题解 | #各城市最大同时等车人数#
各城市最大同时等车人数
https://www.nowcoder.com/practice/f301eccab83c42ab8dab80f28a1eef98
试题方向:同时在线量
思路就是利用 union 链接开始和离开时间,然后赋予1和-1通过窗口累计来计算实时在线人数
重点定义何为等候
1、如果出现无人接单,用户取消 这个时候结束时间计入到 打车表的end time
2、如果接单未上车取消,这个时候 结束时间计入 finish_time
3、正常情况计入 start_time
关于跨天的问题,如果在sql中加入开始时间,那么就能解决跨天的问题。
对于大时间跨度,月最大,一定是某天的天最大,所以这个题不加也可以。
select city ,max(num) as max_wait_uv from ( -- 思路的精华,利用窗口+聚合的累计统计能力,可以得到实时在线人数 -- 这里的细节是tag desc 是需要用倒叙的 select city,dt, sum(tag) over(partition by city,dt order by type ,tag desc) as num from ( -- 记录开始时间 select city,date(event_time) as dt ,event_time as type,1 as tag from tb_get_car_record union all select city,date(event_time) as dt,-- 记录结束时间 -- 这里的细节是根据不同状态,结束时间是不一样的 case when t.order_id is null then end_time when start_time is null then finish_time else start_time end as type,-1 as tag from tb_get_car_record t left join tb_get_car_order using(order_id))t)t1 where dt between '2021-10-01' and '2021-10-31' group by city order by max_wait_uv,city