大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题

embedded/2024/10/19 17:27:39/

之后会不定期更新每日一题sql系列。

SQL面试题每日一题系列内容均来自于网络以及实际使用情况收集,如有雷同,纯属巧合。

1.题目

**问题1:**如下为某直播平台各主播的开播及关播时间数据明细,现在需要计算该平台最高峰期同时在线的主播人数。

问题2:以下为某直播间用户上线与下线的时间数据明细,现求该直播间最高峰同时在线的用户人数。

以上两个问法为同一问题。

2.基础数据准备

sql">create table if not exists temp.user_login_info (`id` bigint comment '用户id',`start_time` string comment '上线时间',`end_time` string comment '下线时间'
) comment '用户上下线时间测试'

数据预览

idstart_timeend_time
12024-05-05 07:59:062024-05-05 08:57:54
22024-05-05 08:14:022024-05-05 08:51:32
32024-05-05 08:38:102024-05-05 08:38:28
42024-05-05 08:41:222024-05-05 08:42:03
52024-05-05 08:33:392024-05-05 08:52:19
62024-05-05 08:54:502024-05-05 08:56:07
72024-05-05 08:56:122024-05-05 08:57:42
82024-05-05 08:21:432024-05-05 08:21:48
92024-05-05 07:59:582024-05-05 08:13:42
102024-05-05 08:20:052024-05-05 08:29:42

3.问题分析

查询同时最大人数,考察的是对拉链转化为日志的处理方式以及聚合开窗函数的累积计算的使用。聚合开窗函数使用详见SQL窗口函数之聚合函数类

维度评分
题目难度⭐️⭐️⭐️⭐️
题目清晰度⭐️⭐️⭐️⭐️⭐️
业务常见度⭐️⭐️⭐️⭐️⭐️

4.解题SQL

1.生成日志流水

对原始数据进行处理,生成主播上下线的日志流水数据,增加标记状态值(上线为1,下线为-1)。

sql">-- 上播记录
select
id,
start_time as log_time,
1 as flag
from temp.user_login_info
union all 
-- 下播记录
select
id,
end_time as log_time,
-1 as flag
from temp.user_login_info

数据结果如下:

idlog_timeflag
12024-05-05 08:57:54-1
22024-05-05 08:51:32-1
32024-05-05 08:38:28-1
42024-05-05 08:42:03-1
52024-05-05 08:52:19-1
62024-05-05 08:56:07-1
72024-05-05 08:57:42-1
82024-05-05 08:21:48-1
92024-05-05 08:13:42-1
102024-05-05 08:29:42-1
12024-05-05 07:59:061
22024-05-05 08:14:021
32024-05-05 08:38:101
42024-05-05 08:41:221
52024-05-05 08:33:391
62024-05-05 08:54:501
72024-05-05 08:56:121
82024-05-05 08:21:431
92024-05-05 07:59:581
102024-05-05 08:20:051

2.开窗函数聚合

对上下线日志流水进行开窗聚合累积计算且查看上下线明细。

sql">select id,log_time,flag,sum(flag) over(order by log_time) as acum_login from (-- 上播记录selectid,start_time as log_time,1 as flagfrom temp.user_login_info where id <= 10union all -- 下播记录selectid,end_time as log_time,-1 as flagfrom temp.user_login_info where id <= 10
) a
order by log_time

数据结果

idlog_timeflagacum_login
12024-05-05 07:59:0611
92024-05-05 07:59:5812
92024-05-05 08:13:42-11
22024-05-05 08:14:0212
102024-05-05 08:20:0513
82024-05-05 08:21:4314
82024-05-05 08:21:48-13
102024-05-05 08:29:42-12
52024-05-05 08:33:3913
32024-05-05 08:38:1014
32024-05-05 08:38:28-13
42024-05-05 08:41:2214
42024-05-05 08:42:03-13
22024-05-05 08:51:32-12
52024-05-05 08:52:19-11
62024-05-05 08:54:5012
62024-05-05 08:56:07-11
72024-05-05 08:56:1212
72024-05-05 08:57:42-11
12024-05-05 08:57:54-10

3.计算最大在线人数

最后计算最大同时在线人数

sql">select max(acum_login) as max_acum_login from (select id,log_time,flag,sum(flag) over(order by log_time) as acum_login from (selectid,start_time as log_time,1 as flagfrom temp.user_login_info where id <= 10union all --下播记录selectid,end_time as log_time,-1 as flagfrom temp.user_login_info where id <= 10) a
) b 

数据结果

max_acum_login
4

最大在线人数为4。

5.衍生问题解答

如果是最上面的问题2,每个房间同时在线最大人数呢?

那它的写法应该是这样的。

sql">select room_id,max(acum_login) as max_acum_login from (select id,room_id,log_time,flag,sum(flag) over(partition by room_id order by log_time) as acum_login from (-- 上线记录selectid,room_id,start_time as log_time,1 as flagfrom temp.user_login_info where id <= 10union all -- 下线记录selectid,room_id,end_time as log_time,-1 as flagfrom temp.user_login_info where id <= 10) a
) b 
group by room_id

就不补充具体数据演示了。

思路:以第一个问题为基础,这里只是多增加了一个房间维度,按房间分组进行开窗聚合累积计算以及最后的分组求最大值。如有问题,欢迎联系我点击此处加群一起学习讨论。

以上,本期全部内容。

感谢阅读。

按例,欢迎点击此处关注我的个人公众号,交流更多知识。


http://www.ppmy.cn/embedded/35411.html

相关文章

自定义类型②③——联合体和枚举

自定义类型②③——联合体和枚举 1.联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员结构体和联合体的对比1.4 联合体大小的计算1.5 联合体的应用①1.5 联合体的应用② 2. 枚举2.1 枚举类型的声明2.2 枚举类型的特点2.3 枚举的优点 1.联合体 1.1 联合体类型的声明 关…

Leetcode—1235. 规划兼职工作【困难】(upper_bound、自定义排序规则)

2024每日刷题&#xff08;125&#xff09; Leetcode—1235. 规划兼职工作 算法思想 实现代码 class Solution { public:int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {int n startTime.size();vec…

PS:技能随记

一、快速制作文字倒影 1、新建文档&#xff0c;15001000的白色文档&#xff0c;回到工具栏&#xff0c;前景色设置为浅蓝色&#xff08;d4e1f5&#xff09;&#xff0c;效果如下图 2、回到工具栏&#xff0c;前景色设置为黑色&#xff0c;打开文字工具&#xff0c;输入自己喜欢…

基于Springboot的校园志愿者管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园志愿者管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

PXE高效批量网络装机

文章目录 一、系统装机过程二、PXE什么是PXE&#xff1f;实现过程详解PXE优点操作过程配置过程截屏 三、kickstart无人值守安装 一、系统装机过程 Linux启动操作系统有三种方式&#xff1a;1.硬盘2.光驱&#xff08;u盘&#xff09;3.网络启动&#xff08;pxe&#xff09; 系统…

【Three.js基础学习】14.Galaxy Generator

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 课程知识点 1. 实现星际编辑器 2. 创建粒子 1000&#xff0c; 在随机位置 3. 创建材质 PointsMaterial 4. Points() 接收 5. 放到gui 中调试 但是会发现调整size 等 属…

CI/CD笔记.Gitlab系列.新用户管理

CI/CD笔记.Gitlab系列 新用户管理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_285502…

Go 语言(四)【常用包使用】

1、命令行参数包 flag flag 包就是一个用来解析命令行参数的工具。 1.1、os.Args import ("fmt""os" )func main() {if len(os.Args) > 0 {for index, arg : range os.Args {fmt.Printf("args[%d]%v\n", index, arg)}} } 运行结果&#…