with status_table as ( select course_id,user_id,in_datetime as watchtime,1 as status from attend_tb union select course_id,user_id,out_datetime as watchtime,-1 as status from attend_tb order by watchtime ) select course_id,course_name,max(num_in_time) as max_num from ( select course_id, course_name, watchtime, status, sum(status) over(partition by course_id order by watchtime) as num_in_time from status_table left join course_tb using(course_id) ) t1 group by course_id,course_name order by course_id
根据进入时间和出去时间建立一个状态变更表,然后分组按时间顺序进行使用窗口函数进行加和操作,再选取max人数就好了