牛客网 SQL大厂面试真题篇 SQL8 每篇文章同一时刻最大在看人数

描述

用户行为日志表tb_user_log

iduidartical_idin_timeout_timesign_cin
110190012021-11-01 10:00:002021-11-01 10:00:110
210290012021-11-01 10:00:092021-11-01 10:00:380
310390012021-11-01 10:00:282021-11-01 10:00:580
410490022021-11-01 11:00:452021-11-01 11:01:110
510590012021-11-01 10:00:512021-11-01 10:00:590
610690022021-11-01 11:00:552021-11-01 11:01:240
710790012021-11-01 10:00:01

2021-11-01 10:01:50

0

(uid-用户ID, artical_id-文章ID, in_time-进入时间, out_time-离开时间, sign_in-是否签到)

场景逻辑说明artical_id-文章ID代表用户浏览的文章的ID,artical_id-文章ID0表示用户在非文章内容页(比如App内的列表页、活动页等)。

问题:统计每篇文章同一时刻最大在看人数,如果同一时刻有进入也有离开时,先记录用户数增加再记录减少,结果按最大人数降序。

输出示例

示例数据的输出结果如下

artical_idmax_uv
90013
90022

解释:10点0分10秒时,有3个用户正在浏览文章9001;11点01分0秒时,有2个用户正在浏览文章9002。

题解:

第一步:查看每篇文章每一时刻用户进入和离开的情况(进入记录1,离开记录-1,方便后面进行加和计算总的用户数)

select artical_id, in_time dt, 1 diff
from tb_user_log 
WHERE artical_id!=0
union all
select artical_id, out_time	 dt, -1 diff
from tb_user_log 
WHERE artical_id!=0

第二步: 计算每篇文章每个时刻的在看人数(先记录用户数增加再记录减少,所以窗口函数里要order by diff)

select artical_id,dt,sum(diff) over(partition by artical_id order by dt,diff desc) instant_view
from(
        select artical_id, in_time dt, 1 diff
        from tb_user_log 
        WHERE artical_id!=0
        union all
        select artical_id, out_time	 dt, -1 diff
        from tb_user_log 
        WHERE artical_id!=0
)t1

 第三步:按照文章ID查看最大在看人数

select artical_id,max(instant_view) max_uv
from(
    select artical_id,dt,sum(diff) over(partition by artical_id order by dt,diff desc) instant_view
    from(
            select artical_id, in_time dt, 1 diff
            from tb_user_log 
            WHERE artical_id!=0
            union all
            select artical_id, out_time	 dt, -1 diff
            from tb_user_log 
            WHERE artical_id!=0
    )t1
)t2                    
group by artical_id
order by max_uv desc

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值