题解 | #每篇文章同一时刻最大在看人数#
每篇文章同一时刻最大在看人数
https://www.nowcoder.com/practice/fe24c93008b84e9592b35faa15755e48
# 对进入时间进行编码为1,代表进入 # 同理,对离开时间编码为-1,代表离开 # 这样得到每一时刻的进入和离开情况表 # 然后计算每一时刻最大在看人数,先加后减,开窗函数(文章id分页,按时间和进出排序) # 最后以文章id分组,取最大在看人数最大值 # 最外层查询,文章id和最大在看人数值 SELECT artical_id, MAX(cnt) max_uv FROM ( # 子查询1 查询文章id,时间,对进入情况进行累加 SELECT artical_id, _time, SUM(come) OVER(PARTITION BY artical_id ORDER BY _time, come DESC) cnt FROM (# 编码表 子查询2 查询uid,文章id, 进入时间,进入情况(进入时是+1) SELECT uid, artical_id, in_time _time, 1 come FROM tb_user_log WHERE artical_id != 0 # 合并检索结果 UNION ALL # 进入情况(离开时是-1) SELECT uid, artical_id, out_time _time, -1 come FROM tb_user_log WHERE artical_id != 0 ) a ) b # 最外层,分组 GROUP BY artical_id # 倒序 ORDER BY max_uv DESC
一直没看懂怎么计算在一个时间段的在看人数。
看题解才知道要对其进行编码,也就是对每个记录,当是进入时间就是进入了,离开时间就是离开了,分别设置为1,-1
这样对整个表进行操作,得到时间编码表,也就是知道了从最开始到最后每个文章的进入离开情况。比如时刻1是进入了一个,那么在看人数就是1,在时刻2进入了一个,那么现在就2,时刻3离开了一个,那现在就是1.用这样的方式来计算同一时间段的在看人数
再累加,这里要注意是先算进的,再算离开的。区别在于,如果当前时刻有3个人在看,后续一个时刻离开了一个,又进来了一个,如果先离开再进来,那就是3-1=2, 2+1=3,如果是先进来再离开,那就是3+1=4, 4-1 = 3,这样就能多来点人了。
最后就是分组求最值得到结果