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

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

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

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务