同一时刻最大在线人数问题

同一时刻最大在线人数,是SQL面试题中一道经典的题目。

一般每条数据都记录了某用户在某一时刻登入,在某一时刻登出。

对于同一时刻最大在线人数问题都有着固定的解题思路。

1、通用解题思路

  1. 将登录和登出分开看,我们只需要构造出三列数据,第一列为用户id,第二列为时间字段,第三列是一个标记列(用1代表登入,-1代表登出)。此时就需要用两个查询,第一个查询用来查用户登入的时间并打标记为1,第二个查询用来查用户登出的时间并打标记为-1,最后通过union进行拼接。
  2. 通过 sum(标记字段) over(partition by 分组字段 order by 时间字段, 标记字段 desc) 进行分组排序开窗统计。我们不需要管是谁进来了或者谁出去了,我们只需要按照时间升序对标记字段进行依次求和就可以了,因为只要进来了标记就为1,出去了标记就为-1,因此sum累加就代表进来一个人就加1出去一个就减1。不过还需要注意一点的是,同一时刻有进有出要看题目是先统计进来的,还是先统计出去的。一般都是先统计进来的,因此开窗排序时先对时间字段升序排列,然后再按照标记标记字段降序排列,这样同一时刻进来的会先进行sum求和,然后才是出去的。
  3. 分组求出最大的在线人数。

2、大厂某度面试真题

2.1 准备工作

# 建表
DROP TABLE IF EXISTS tb_user_log;
CREATE TABLE tb_user_log (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    ui
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值