题解 | #牛客直播各科目同时在线人数#

牛客直播各科目同时在线人数

http://www.nowcoder.com/practice/d69677e41f9a4bf3b3ed7a42573e9490

一、题目&解题步骤

题目:统计每个科目最大同时在线人数(按course_id排序)
又是一题求同时在线题。

解题思路,分三步走:
首先,取用户进入直播间,并赋值uv为1;取用户离开直播间,并赋值uv为-1;然后使用窗口函数计算直播间的瞬时用户数;最后,取各个科目直播间的瞬时最大值,并按照course_id排序。

1)取用户进入直播间,并赋值uv为1;取用户离开直播间,并赋值uv为-1
SELECT course_id,user_id,in_datetime dt,1 AS uv FROM attend_tb
UNION ALL
SELECT course_id,user_id,out_datetime dt,-1 AS uv FROM attend_tb;

2)使用窗口函数计算直播间的瞬时用户数
SELECT course_id,course_name,SUM(uv)OVER(PARTITION BY course_id ORDER BY dt,uv DESC) uv_cnt 
FROM (SELECT course_id,user_id,in_datetime dt,1 AS uv FROM attend_tb
       UNION ALL
       SELECT course_id,user_id,out_datetime dt,-1 AS uv FROM attend_tb)uv_tb 
JOIN course_tb USING(course_id);

3)取各个科目直播间的瞬时最大值并按照course_id排序
SELECT course_id,course_name,MAX(uv_cnt)max_num
FROM(
	SELECT course_id,course_name,SUM(uv)OVER(PARTITION BY course_id ORDER BY dt,uv DESC) uv_cnt 
	FROM (SELECT course_id,user_id,in_datetime dt,1 AS uv FROM attend_tb
		UNION ALL
		SELECT course_id,user_id,out_datetime dt,-1 AS uv FROM attend_tb)uv_tb 
	JOIN course_tb USING(course_id)
)t1 GROUP BY course_id,course_name ORDER BY course_id;

SQL解题集 文章被收录于专栏

这是牛客SQL相关的解题集

全部评论
求同时在线最高瞬时用户数的方法一般方法分为三步走(以直播间为例):1)取用户进入直播间,并赋值uv为1;取用户离开直播间,并赋值uv为-1;2)使用窗口函数计算直播间的瞬时用户数;最3)取各个直播间的瞬时最大值
3 回复 分享
发布于 2022-04-11 18:12
这个题和sql题目163题目计算文章同时在线最大浏览人数的思路是一样的,计算最高瞬时用户数的题目三部曲,首先给进入时间戳和退出时间戳赋值命名为diff,然后利用窗口函数,按照时间戳的升序,diff降序进行sum的窗口函数调用,最后,根据物品id聚类,利用max函数求得一个物品id里面出现的最大值
2 回复 分享
发布于 2023-05-05 11:42 北京
原来如此,最大同时在线人数会在某个用户刚进入直播间时达到
2 回复 分享
发布于 2022-11-13 09:43 广东
计算截止每个瞬间的上线人数减去下线人数,为啥在开窗函数的时候不加上瞬间(这个时刻)的分组条件呢,而是只按照course_id分组?
1 回复 分享
发布于 2022-06-28 17:06

相关推荐

SHC2:关键问题是你这三段实习是三个不同的岗位…你这样子秋招就是只有一段实习的本科生..
点赞 评论 收藏
分享
评论
42
9
分享

创作者周榜

更多
牛客网
牛客企业服务