思路分析:
(1)对登录、登出数据构建map结构map(1, login_ts, -1, logout_ts),使用炸裂函数对该map做炸裂处理
(2)炸裂后成为了两列,一列存储1or-1表示登录登出(k),一列存储的是时间,既有登录的又有登出的
按照时间排序求k的累计值,要求窗口范围到当前行
(3)取出上一步计算出的最大值就是同时最大在线人数
注:
lateral view explode(map(1, login_ts, -1, logout_ts)) v as k, v会将map结构中的k-v转化为两列;
sum(k) over (partition by 1 order by v rows between unbounded preceding and current row) sum_user 整体化为一个组,按照时间做排序,求起始行到当前行窗口范围内的累计值
代码实现:
select
max(sum_user) cn
from (
select
sum(k) over (partition by 1 order by v rows between unbounded preceding and current row) sum_user
from user_login_detail
lateral view explode(map(1, login_ts, -1, logout_ts)) v as k, v
) t;