40.同时最大在线人数问题求解(炸裂map)

在这里插入图片描述

思路分析:
(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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值