(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