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

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

https://www.nowcoder.com/practice/d69677e41f9a4bf3b3ed7a42573e9490

# 同时在线题目,一般有两个时间点(登录和退出),那既没有人退出也没有人登录的时间点在线人数是不变的,也就是说在线人数变化只在有人登录和有人退出的时候。
# 考虑把对时间的横向比较取交集转换为纵向的人数增减统计。
# 将原表拆成登录表和退出表,登录表中所有记录后面增加一个字段值为1(代表在线人数+1)
# 退出表则增加一个字段(值为-1)代表在线人数-1
# 然后通过union_all拼接登录表和退出表,对course_id进行开窗,按时间点升序排序,使用sum()统计当前时间点的在线人数【over()指定排序,开窗实现从第一行到当前行的pv累加】。

# 是union all,不是union_all,请修正记忆。

with a as (
    select user_id, course_id, substring_index(in_datetime,' ',-1) checktime, 1 uv
    from attend_tb
), b as (
    select user_id, course_id, substring_index(out_datetime,' ',-1) checktime, -1 uv
    from attend_tb
), c as (
    select *
    from a 
    union all
    select *
    from b
), d as (
    select course_id, sum(uv) over (
        partition by course_id
        order by checktime
    ) attend_num
    from c
)

select d.course_id, course_name, max(attend_num) max_num
from d 
inner join course_tb
on d.course_id = course_tb.course_id
group by d.course_id, course_name;

全部评论

相关推荐

10-10 16:30
济宁学院 Java
不想做程序员:面试官:蓝桥杯三等奖?你多去两次厕所都能拿二等吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务