题解 | #牛客直播各科目同时在线人数#
牛客直播各科目同时在线人数
https://www.nowcoder.com/practice/d69677e41f9a4bf3b3ed7a42573e9490
同时在线人数固定思路:根据进入和退出时间构造新列num进行编码,进入时num编码为1,退出时编码为-1;将退出时间和进入时间使用union all进行合并;同时使用窗口函数,对课程id进行分组,按照时间进行升序排序,此时对构造的num列进行窗口累加,则每进入一个用户则加一,退出一个则减一。
注意:如果同一时刻既有退出又有进入,则看题意是先计算增加人数,还是先计算减少人数。如果先计算增加,则只需将num较大的放前边,也即sum(t1.num) over(partition by t1.course_id order by t1.time1, t1.num desc)就行了。
with temp as ( select t1.course_id, sum(t1.num) over(partition by t1.course_id order by t1.time1, t1.num desc) as total from ( select course_id, at.in_datetime time1, 1 as 'num' from attend_tb at union all select course_id, at.out_datetime time1, -1 as 'num' from attend_tb at ) t1 ) select ct.course_id, ct.course_name, max(temp.total) from course_tb ct join temp on ct.course_id=temp.course_id group by ct.course_id, ct.course_name