又是一道求同时最大在线人数的题,
首先我们先对每个时刻的人数进行标记,进来的为1,退出的为-1
select user_id,course_id,in_datetime dt,1 diff
    from attend_tb
    union all
    select user_id,course_id,out_datetime dt,-1 diff
    from attend_tb
因为有的用户中途退出,又进去了,所以我们要对上述表进行去重,
with t1 as
    (select user_id,course_id,in_datetime dt,1 diff
    from attend_tb
    union all
    select user_id,course_id,out_datetime dt,-1 diff
    from attend_tb)
select *
from t1
group by user_id,course_id,diff
having dt=min(dt)
接下来就是用窗口函数求累计值了,这里要注意order by diff desc,因为用户是先进来,后退出,所以先是加1,再减一
select course_id,
         sum(diff) over (partition by course_id order by dt,diff desc) as num
    from 
        (select *
        from t1
        group by user_id,course_id,diff
        having dt=min(dt)
         ) a
最后连接课程表,完整代码如下
with t1 as
    (select user_id,course_id,in_datetime dt,1 diff
    from attend_tb
    union all
    select user_id,course_id,out_datetime dt,-1 diff
    from attend_tb)
select b.course_id,course_name,max(num) max_num
from
    (select course_id,
         sum(diff) over (partition by course_id order by dt,diff desc) as num
    from 
        (select *
        from t1
        group by user_id,course_id,diff
        having dt=min(dt)
         ) a
    ) b
join course_tb
on b.course_id=course_tb.course_id
group by b.course_id
order by b.course_id;