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

各城市最大同时等车人数

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
全部评论

相关推荐

努力成为C语言高手:质疑大祥老师,理解大祥老师,成为大祥老师
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务