一、题目&解题步骤

题目:统计每个科目最大同时在线人数(按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;