题解 | 牛客直播各科目同时在线人数
牛客直播各科目同时在线人数
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;
叮咚买菜公司氛围 125人发布
查看13道真题和解析