经典题做个标记

思路:

1.有in_datetime的时间说明有用户入场 为其标记为1

2.有out_datetime的时间说明有用户离场 为其标记为-1

3.将上述数据union起来后,使用窗口函数根据course_id进行分区,按照时间进行排序

4.最终取出最大值即为同时在线的人数

with t as (select 
    user_id,
    course_id,
    in_datetime dt,
    1 as ct
from attend_tb
union 
select 
    user_id,
    course_id,
    out_datetime dt,
    -1 as ct
from attend_tb)

select 
    course_id,
    course_name,
    max(sum_ct)
from 
(select 
    t.course_id,
    c.course_name,
    dt,
    sum(ct) over(partition by course_id order by dt) sum_ct
from t
join course_tb c
on t.course_id = c.course_id) tt
group by course_id,course_name
order by course_id