lead ( login_time, 1, login_time ):第三个参数,是默认值。如果当前行后面第 1 行不存在(比方在分区的最后一行时),则利用这个默认值。
根据条件where cnt = max_cnt用来筛选出那些在线人数达到最大值的时间点。
with data1 as (
select room_id,user_id,date_format(login_in,'yyyy-MM-dd HH:mm:ss') login_time,1 flag from user_log_tb
union all
select room_id,user_id,date_format(login_out,'yyyy-MM-dd HH:mm:ss') login_time,-1 flag from user_log_tb
),
data2 as (
select room_id,login_time,flag,sum(flag) over (partition by room_id order by login_time) cnt from data1
),
data3 as (
select room_id,login_time,flag,cnt,max(cnt) over (partition by room_id) max_cnt,lead ( login_time, 1, login_time ) OVER ( ORDER BY login_time ) lead_dt from data2
)
select room_id,max_cnt,login_time as start_time,lead_dt as end_time from data3 where cnt = max_cnt;