1、将数据切分:实际上就是将开播时间和下播时间转换成一条条记录。也就是列转行,我们用熟悉的UNION操作,进行转换。
2、数据标记。在上述SQL基础上直接进行标记即可.如果数据本来就是分开的则用case when进行标记
select
user_id,
live_id,
in_datetime dt ,
1 flag
from
live_events
union
select
user_id,
live_id,
out_datetime dt,
-1 flag
from
live_events;
3、数据按照时间排序,进入累加器进行累加(按时间排序是累加的关键)
select
live_id,
sum(flag) over(
partition by live_id
order by
dt
) as cur_cnt
from
(
select
user_id,
live_id,
in_datetime dt ,
1 flag
from
live_events
union
select
user_id,
live_id,
out_datetime dt,
-1 flag
from
live_events
) t
4、获取累加器中当前时刻累加的最大值,即为同时开播最多的人数
select
live_id,
max(cur_cnt) max_user_count
from
(
select
live_id,
sum(flag) over(
partition by live_id
order by
dt
) as cur_cnt
from
(
select
user_id,
live_id,
in_datetime dt ,
1 flag
from
live_events
union
select
user_id,
live_id,
out_datetime dt,
-1 flag
from
live_events
) t
) m
group by live_id;