select b.course_id,ct.course_name,max(uv) as max_num from (
select course_id,timestamp,
sum(uv) over(partition by course_id order by timestamp) as uv from 
(
select course_id,in_datetime as timestamp,1 as uv from attend_tb
union all
select course_id,out_datetime as timestamp,-1 as uv from attend_tb
) a
) b
left join course_tb ct on b.course_id = ct.course_id
group by b.course_id,course_name
order by course_id;

解题思路:

1、因为每一个都有进入和退出时间,我们要去计算这两种情况,想到了分别计算,然后进行合一统计;

2、利用开窗函数,算出结果可以得到每个时间段的在线人数;

3、统计结果,然后分组计算最后的值。

困难点:

这道题难在同时在线的理解:因为无法确认每个人的上线时间,只能通过登录时间和登出时间来算,所以可以想到当登入一位时,进行+1,当退出一位时,进行-1。就可以知道一段时间内的同时在线人数了。