select
artical_id
,max(max_uv) max_uv
from (
select
artical_id
,sum(num)over(partition by artical_id order by dt asc, num desc) max_uv
from (
select
artical_id
,in_time dt
,1 as num
from tb_user_log
where artical_id != 0
union all
select
artical_id
,out_time dt
,-1 as num
from tb_user_log
where artical_id != 0
) t
) t
group by 1
order by max_uv desc
- 将用户的进入时间单独拎出来,同时记为1;离开时间单独拎出来,同时记为-1,这样就聚合这两个表,按照时间排序,意思就是:进去一个加1,离开一个减1。
- 然后利用窗口函数对计数(1或者-1)求累计和,因为题目规定:同一时间有就有出的话先算进来的后算出去的,所以排序的时候就要看好了先按时间排序,再按计数排序!
- 然后再在每个分组里面去max最大的累积和就是最多同时在线的人数了