# 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函数就顺利通过了