点击上方蓝色【数据攻略】关注+星标~
第一时间获取最新内容

本篇,将结合 真实 业务需求
一、业务背景
二、数据说明
三、解题思路
四、SQL实战
ps.文末有备考Tips
最大在线人数的定义举例:
① 文章同时阅读的最大人数
② 视频同时在看的最大人数
③ 商品同时在看的最大人数
场景举例①:
《大厂SQL精讲课》同时在看的最大人数
数据攻略里每篇文章的最大在线阅读人数

场景举例②:

类似的场景可以列举很多
几乎所有大厂,只要有平台/产品/网站都可考查此类题目
毕竟,最大在线人数此指标可反应产品的热度和质量
由于业务不一样,数据类型会有差异
用户信息,可以有以下类型 用户ID:一般为注册的UID
设备ID:用来唯一标识用户使用的设备
cookie:即便用户不登录的情况下,也可以识别用户身份
产品ID,唯一标识产品信息
文章ID,不同的文章,ID不一样
视频ID,不同的视频,ID不一样
商品ID,不同的商品,ID不一样
其他,比如评论ID
进入时间:标记用户访问产品的时间
离开时间:标记用户访问产品离开的时间

▼ 思考:
① 如此刻的你刚好也叫六哥,如何区分呢?
② 如文章名相同,该如何区分呢?
① 都叫六哥,但系统分配的用户ID不一样
② 都是SQL实战,但系统分配的文章ID不一样
为了贴近实际业务,我将样例数据进行转换

为了查找uid=10001对应的是六哥 articleid=90001对应的是《数据分析岗 | AB实验框架+高频考点(一)》
所以会有两张信息表

表1:文章访问信息(artical_log)


表3:文章信息表(artical_info)

『SQL实战问题』
统计每篇文章同一时刻最大在看人数,如果同一时刻有进入也有离开时,先记录用户数增加再记录减少,结果按最大人数降序。
为便于大家实战,以下是本题数据集:
DROP TABLE IF EXISTS artical_log;CREATE TABLE artical_log (uid INT COMMENT '用户ID',artical_id INT COMMENT '文章ID',start_time datetime COMMENT '进入时间',end_time datetime COMMENT '离开时间');INSERT INTO artical_log(uid, artical_id, start_time, end_time) VALUES(10001, 9001, '2022-08-01 10:00:00', '2022-08-01 10:00:11'),(10002, 9001, '2022-08-01 10:00:09', '2022-08-01 10:00:38'),(10003, 9001, '2022-08-01 10:00:28', '2022-08-01 10:00:58'),(10004, 9002, '2022-08-01 11:00:45', '2022-08-01 11:01:11'),(10005, 9001, '2022-08-01 10:00:51', '2022-08-01 10:00:59'),(10006, 9002, '2022-08-01 11:00:55', '2022-08-01 11:01:24'),(10007, 9001, '2022-08-01 10:00:01', '2022-08-01 10:01:50');DROP TABLE IF EXISTS artical_info;CREATE TABLE artical_info (artical_id INT COMMENT '文章ID',artical_name varchar(60) COMMENT '文章名称');INSERT INTO artical_info(artical_id, artical_name) VALUES(9001,'数据分析岗 | AB实验框架+高频考点(一)'),(9002,'【数据分析岗】| AB实验之方案设计(二)'),(9003,'数据分析岗 | AB实验之实验分流(三)'),(9004,'AB高频考点!大白话讲懂『多重检验』'),(9005,'【数据分析岗】SQL类高频考点归纳'),(9006,'SQL出题技巧及大厂母题(附答案)'),(9007,'【SQL实战】淘宝营销活动分析');DROP TABLE IF EXISTS user_info;CREATE TABLE user_info (uid INT COMMENT '用户id',uid_name varchar(60) COMMENT '文章名称');INSERT INTO user_info(uid, uid_name) VALUES(10001,'六哥'),(10002,'罗卡'),(10003,'张三'),(10004,'李四'),(10005,'赵五'),(10006,'钱六'),(10007,'高八');
方便理解,将每篇文章记为一个图书馆的阅读区。
本题的文章访问信息的样例中
假设每个阅读区仅有一条门出入
且门口有一位场馆管理员
只要进入一个读者,管理员将手动计入+1
只要出去一个读者管理员将计入-1


接下来,按照每个场馆发生的顺序进行排序

每次进入进出都会统计一下当前场馆人数

统计解读(以9002场馆为例):
10004第一个进入,当前场馆人数为1
10006第二个进入,当前场馆人数为2
10004离开场馆,当前场馆人数为1
10006离开场馆,当前场馆人数为0
以此类推,可得9001场馆每次进入进出的人数
下面通过Excel的计算加深理解

统计解读:
10005进入场馆9001,当前场馆人数为从第一个进入场馆进行求和。
步骤 ①
① 将样例数据拆分为进入和进出
selectartical_id-- 进入时间,start_time as log_time,1 as numfrom artical_logunion allselectartical_id-- 离开时间,end_time as log_time,-1 as numfrom artical_log
步骤 ②
selectartical_id,sum(num) over (partition by artical_id order by log_time asc,num desc) as online_uvfrom(selectartical_id-- 进入时间,start_time as log_time,1 as numfrom artical_logunion allselectartical_id-- 离开时间,end_time as log_time,-1 as numfrom artical_log)a
步骤 ③
selectartical_id,max(online_uv) AS max_online_uvfrom(selectartical_id,sum(num) over (partition by artical_id order by log_time asc,num desc) as online_uvfrom(selectartical_id-- 进入时间,start_time as log_time,1 as numfrom artical_logunion allselectartical_id-- 离开时间,end_time as log_time,-1 as numfrom artical_log)a)agroup byartical_id
运行结果如下:

步骤 ④
细心的你会发现,此处9001是文章id
文章ID在结果查看不够直观
所以还需要对文章ID进行 匹配转义
selectb.artical_name,a.artical_id,a.max_online_uvfrom(selectartical_id,max(online_uv) AS max_online_uvfrom(selectartical_id,sum(num) over (partition by artical_id order by log_time asc,num desc) as online_uvfrom(selectartical_id-- 进入时间,start_time as log_time,1 as numfrom artical_logunion allselectartical_id-- 离开时间,end_time as log_time,-1 as numfrom artical_log)a)agroup byartical_id)ainner join artical_info bon a.artical_id = b.artical_id

以上就是易考题:
最大在线人数的全部讲解~
▌备考Tips:
通常情况下,求职黄金窗口期不是很长
没错,那如何在有效时间里
可以高效练习?还能达到事半功倍效果?
答:结合常考知识点,按照行业、业务、指标、常遇统计场景分类做准备,这样通常情况下,会一道题,也顺带理解归纳这类业务的指标、逻辑、难点等,换汤不换药后,演绎类比,依然不被难倒,并尽量降低了考试时的理解成本,提高做题速率。

六哥联合大厂出题官推出SQL冲刺课程,含:
高频考点梳理+归纳
典型题视频精讲,手把手教你解题
含大厂业务背景的配套练习题库(持续更新)
出题面试官在线思路点拨+不定期加餐&直播答疑
需要的同学可拍后找我拉群,助你高效冲刺笔面试
讲真,3杯奶茶的价格换高效率萃取知识,不会亏
如若盼 追更 『求职类』干货系列 

往期好文推荐 
更多 『求职干货』 & 『日常学习』 系列好文,等你发现~

Ps. 微信推文改了规则
看完记得设置为 “ 星标 ”
不然我会消失的






