(1)将每类课程中的所有用户登入时间定义为1,推出时间定义为-1,然后使用集合函数进行拼接,并按照时间进行正向排序
        select t1.course_id, t2.user_id, t1.course_name,
        t2.in_datetime as dt, 1 as uv

        from course_tb as t1
        left join attend_tb as t2
        on t1.course_id = t2.course_id

        union all

        select t1.course_id, t2.user_id, t1.course_name,
        t2.out_datetime as dt, -1 as uv

        from course_tb as t1
        left join attend_tb as t2
        on t1.course_id = t2.course_id

        order by 1,4

结果展示:
1	1|102|Python|2021-12-01 19:00:00|1		
2	1|101|Python|2021-12-01 19:00:00|1		
3	1|100|Python|2021-12-01 19:00:00|1		
4	1|104|Python|2021-12-01 19:00:00|1		
5	1|102|Python|2021-12-01 19:05:00|-1		
6	1|100|Python|2021-12-01 19:28:00|-1		
7	1|100|Python|2021-12-01 19:30:00|1		
8	1|100|Python|2021-12-01 19:53:00|-1		
9	1|101|Python|2021-12-01 20:55:00|-1		
10	1|104|Python|2021-12-01 20:59:00|-1		
11	2|102|SQL|2021-12-02 18:55:00|1		
12	2|104|SQL|2021-12-02 18:57:00|1		
13	2|101|SQL|2021-12-02 19:05:00|1		
14	2|107|SQL|2021-12-02 19:10:00|1		
15	2|107|SQL|2021-12-02 19:18:00|-1		
16	2|104|SQL|2021-12-02 20:56:00|-1		
17	2|101|SQL|2021-12-02 20:58:00|-1		
18	2|102|SQL|2021-12-02 21:00:00|-1		
19	3|102|R|2021-12-03 18:58:00|1		
20	3|100|R|2021-12-03 19:01:00|1		
21	3|108|R|2021-12-03 19:01:00|1		
22	3|102|R|2021-12-03 19:05:00|-1		
23	3|108|R|2021-12-03 19:56:00|-1		
24	3|100|R|2021-12-03 21:00:00|-1

(2)对拼接后按照时间排序的新数据表,求各个时间点(如19:00时刻的总人数)的人数汇总
    select a.course_id, a.course_name, a.dt,
    sum(a.uv) over(partition by a.course_id order by a.dt, a.uv desc) as uv_cnt
    from
    (xxx) as a

结果展示:
1	1|Python|2021-12-01 19:00:00|4		
2	1|Python|2021-12-01 19:00:00|4		
3	1|Python|2021-12-01 19:00:00|4		
4	1|Python|2021-12-01 19:00:00|4		
5	1|Python|2021-12-01 19:05:00|3		
6	1|Python|2021-12-01 19:28:00|2		
7	1|Python|2021-12-01 19:30:00|3		
8	1|Python|2021-12-01 19:53:00|2		
9	1|Python|2021-12-01 20:55:00|1		
10	1|Python|2021-12-01 20:59:00|0		
11	2|SQL|2021-12-02 18:55:00|1		
12	2|SQL|2021-12-02 18:57:00|2		
13	2|SQL|2021-12-02 19:05:00|3		
14	2|SQL|2021-12-02 19:10:00|4		
15	2|SQL|2021-12-02 19:18:00|3		
16	2|SQL|2021-12-02 20:56:00|2		
17	2|SQL|2021-12-02 20:58:00|1		
18	2|SQL|2021-12-02 21:00:00|0		
19	3|R|2021-12-03 18:58:00|1		
20	3|R|2021-12-03 19:01:00|3		
21	3|R|2021-12-03 19:01:00|3		
22	3|R|2021-12-03 19:05:00|2		
23	3|R|2021-12-03 19:56:00|1		
24	3|R|2021-12-03 21:00:00|0		

(3)分别按照每个course_id、course_name进行分组,并从刚才的数据表中挑选出《存在最大人数》的时间段,然后将《最大人数》作为结果进行展示
select b.course_id, b.course_name, max(b.uv_cnt) as max_num
from
(xxx) as b
group by 1,2
order by 1

结果展示:
1	Python	4
2	SQL	4
3	R	3