看了大神写的代码,主要是在聚合函数sum()over()当中没有弄懂排序order by Time, Mark desc这部分。后来想了一想,就明白了。如果大伙儿也有这步没有弄明白的。可以看看我的解释。至于代码(在下面),我也是看了大神写的,后来敲出来了。

select artical_id, max(cnt) as ax
from 
	(select artical_id,
    sum(Mark) over (partition by artical_id order by Time, Mark desc) as cnt
	from 
	(select artical_id, in_time as Time , 1 Mark from tb_user_log where artical_id != 0
	union all
	select artical_id, out_time as Time , -1 Mark from tb_user_log where artical_id != 0) as a
)as b
group by artical_id
order by ax desc

敲黑板!!! 解释排序这部分order by Time, Mark desc

第一步:理解 order by Time

order by Time 这个巧妙地将时间揉在了一起(不管是进,还是出),先把时间从小到大排在了一起。举个例子——同一篇文章A的观看时间:

第一个人是在1分的时候开始看,5分钟后结束。
第二个人是在4分的时候开始看,6分钟后结束。
第三个人是在5分的时候开始看,7分钟后结束。

一旦排序,就变成了: 1(开始看),4(开始看),5,5(开始看),6, 7.这样就知道哪些人在同一时刻看同一篇文章了。很明显,时间在4分钟至5分钟的时候,第一个人和第二个人在同一个时间内观看文章A。

第二步:理解 order by Mark

题目要求在瞬时统计时遵循【先进后出】。这里第二次排序就是对【先进后出】的解释

order by Mark desc(先 1再-1)这里不是时间的大小了用降序desc,就只是让 1(先算进去的)排前面, -1(再算退出去的)排后面的区别。那就变成了:

1(+1), 4(+1), 5 (+1), 5(-1), 6(-1), 7(-1)

从 1(+1), 4(+1), 5 (+1),一直到 5(-1) 这就是第一个人看文章的时间区间。计算一下:

+1 +1 +1 -1 = 2 有两个人再看同一时间区间观看文章A。

不知道大伙儿懂了没有?