题解 | #每篇文章同一时刻最大在看人数#

每篇文章同一时刻最大在看人数

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,这样就能多来点人了。

最后就是分组求最值得到结果

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务