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。就可以知道一段时间内的同时在线人数了。