又是一道求同时最大在线人数的题,
首先我们先对每个时刻的人数进行标记,进来的为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;