题解 | #每篇文章同一时刻最大在看人数#
每篇文章同一时刻最大在看人数
https://www.nowcoder.com/practice/fe24c93008b84e9592b35faa15755e48
select artical_id
,max(uv) AS max_uv
from(
select artical_id
,sum(flag) over(partition by artical_id order by act_time asc,flag desc) AS uv
from(
select artical_id
,in_time AS act_time
,1 AS flag
from tb_user_log
where artical_id <> 0
union all
select artical_id
,out_time AS act_time
,-1 AS flag
from tb_user_log
where artical_id <> 0
)t1
)t2
group by artical_id
order by max_uv desc
1、求的是每篇文章同一时刻最大在线人数===》每个时刻累计在线人数,求哪个时刻的累计在线人数最大。这个过程有进有出
2、需要把各个用户进去的时间标记为1,出来时间的标记为-1,然后用开窗函数sum进行组内累计求和,按照artical_id,用开窗函数sum(flag) over(partition by artical_id order by act_time, flag desc). sum(flag)是对进入和离开的人数进行求和,规则是按照文章id分组,按照时间升序排序,flag降序排序是为了达到题目的要求(同时进去和离开的,先加再减)。这样就可以求出每篇文章在各个时刻的累计在线人数。最后用max就可以求出最大同时在线人数。