同一时刻最大在线人数,是SQL面试题中一道经典的题目。
一般每条数据都记录了某用户在某一时刻登入,在某一时刻登出。
对于同一时刻最大在线人数问题都有着固定的解题思路。
1、通用解题思路
- 将登录和登出分开看,我们只需要构造出三列数据,第一列为用户id,第二列为时间字段,第三列是一个标记列(用1代表登入,-1代表登出)。此时就需要用两个查询,第一个查询用来查用户登入的时间并打标记为1,第二个查询用来查用户登出的时间并打标记为-1,最后通过union进行拼接。
- 通过 sum(标记字段) over(partition by 分组字段 order by 时间字段, 标记字段 desc) 进行分组排序开窗统计。我们不需要管是谁进来了或者谁出去了,我们只需要按照时间升序对标记字段进行依次求和就可以了,因为只要进来了标记就为1,出去了标记就为-1,因此sum累加就代表进来一个人就加1出去一个就减1。不过还需要注意一点的是,同一时刻有进有出要看题目是先统计进来的,还是先统计出去的。一般都是先统计进来的,因此开窗排序时先对时间字段升序排列,然后再按照标记标记字段降序排列,这样同一时刻进来的会先进行sum求和,然后才是出去的。
- 分组求出最大的在线人数。
2、大厂某度面试真题
2.1 准备工作
# 建表
DROP TABLE IF EXISTS tb_user_log;
CREATE TABLE tb_user_log (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
ui