# select
# artical_id,
# in_time,
# rank() over(partition by artical_id order by in_time)
# from tb_user_log
# order by artical_id,in_time
select 
artical_id,
max(number)
from
(select 
artical_id,
sum(num) over(partition by artical_id order by time,num desc) as number
from
(
select
artical_id,
in_time as time,
1 as num
from tb_user_log
where artical_id != 0
union all
select
artical_id,
out_time as time,
-1 as num
from tb_user_log 
where artical_id != 0) t1) t2
group by artical_id
order by max(number) desc

首先将进入时间和退出时间放在同一个时间轴上考虑,即放入一个字段中,在这里要将进入的数据行加入1的字段,为退出的数据行加上-1的字段,这样就得到第一个t1表,即用户进入及退出的时间表。

由于涉及到累加操作,使用窗口函数,按照artical_id分类,并且以t1表中的时间作为排序方式进行累加。值得注意的是。由于题目要求同一时间的最大值,而同一时间有可能同时有人进入和退出,为了保证累加的是最大值,还要加个标记字段(1或-1)的倒序排列,不然在同一时间可能会计算先退出一个人再进入一个人的情况,就不是最大值了。

还有一个卡住我的点就是开始我用的是union函数,后面改成union all函数就能通过了,我才知道union函数时会自动去重的,union all函数不会,在这里明显是不需要去重操作的,因此改成union函数就顺利通过了