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

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

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

1.题目

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

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

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

2.基础数据准备

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

数据预览

id start_time end_time
1 2024-05-05 07:59:06 2024-05-05 08:57:54
2 2024-05-05 08:14:02 2024-05-05 08:51:32
3 2024-05-05 08:38:10 2024-05-05 08:38:28
4 2024-05-05 08:41:22 2024-05-05 08:42:03
5 2024-05-05 08:33:39 2024-05-05 08:52:19
6 2024-05-05 08:54:50 2024-05-05 08:56:07
7 2024-05-05 08:56:12 2024-05-05 08:57:42
8 2024-05-05 08:21:43 2024-05-05 08:21:48
9 2024-05-05 07:59:58 2024-05-05 08:13:42
10 2024-05-05 08:20:05 2024-05-05 08:29:42

3.问题分析

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

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

4.解题SQL

1.生成日志流水

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

-- 上播记录
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

数据结果如下:

id log_time flag
1 2024-05-05 08:57:54 -1
2 2024-05-05 08:51:32 -1
3 2024-05-05 08:38:28 -1
4 2024-05-05 08:42:03 -1
5 2024-05-05 08:52:19 -1
6 2024-05-05 08:56:07 -1
7 2024-05-05 08:57:42 -1
8 2024-05-05 08:21:48 -1
9 2024-05-05 08:13:42 -1
10 2024-05-05 08:29:42 -1
1 2024-05-05 07:59:06 1
2 2024-05-05 08:14:02 1
3 2024-05-05 08:38:10 1
4 2024-05-05 08:41:22 1
5 2024-05-05 08:33:39 1
6 2024-05-05 08:54:50 1
7 2024-05-05 08:56:12 1
8 2024-05-05 08:21:43 1
9 2024-05-05 07:59:58 1
10 2024-05-05 08:20:05 1

2.开窗函数聚合

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

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

数据结果

id log_time flag acum_login
1 2024-05-05 07:59:06 1 1
9 2024-05-05 07:59:58 1 2
9 2024-05-05 08:13:42 -1 1
2 2024-05-05 08:14:02 1 2
10 2024-05-05 08:20:05 1 3
8 2024-05-05 08:21:43 1 4
8 2024-05-05 08:21:48 -1 3
10 2024-05-05 08:29:42 -1 2
5 2024-05-05 08:33:39 1 3
3 2024-05-05 08:38:10 1 4
3 2024-05-05 08:38:28 -1 3
4 2024-05-05 08:41:22 1 4
4 2024-05-05 08:42:03 -1 3
2 2024-05-05 08:51:32 -1 2
5 2024-05-05 08:52:19 -1 1
6 2024-05-05 08:54:50 1 2
6 2024-05-05 08:56:07 -1 1
7 2024-05-05 08:56:12 1 2
7 2024-05-05 08:57:42 -1 1
1 2024-05-05 08:57:54 -1 0

3.计算最大在线人数

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

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 (
select
id,
start_time as log_time,
1 as flag
from temp.user_login_info where id <= 10
union all
--下播记录
select
id,
end_time as log_time,
-1 as flag
from temp.user_login_info where id <= 10
) a
) b

数据结果

max_acum_login
4

最大在线人数为4。

5.衍生问题解答

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

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

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 (
-- 上线记录
select
id,room_id,
start_time as log_time,
1 as flag
from temp.user_login_info where id <= 10
union all
-- 下线记录
select
id,room_id,
end_time as log_time,
-1 as flag
from temp.user_login_info where id <= 10
) a
) b
group by room_id

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

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

以上,本期全部内容。

感谢阅读。

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

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

  1. 面试系列二:精选大数据面试真题JVM专项-附答案详细解析

    公众号(五分钟学大数据)已推出大数据面试系列文章-五分钟小面试,此系列文章将会深入研究各大厂笔面试真题,并根据笔面试题扩展相关的知识点,助力大家都能够成功入职大厂! 大数据笔面试系列文章分为两种类型: ...

  2. MYSQL数据库导入大数据量sql文件失败的解决方案

    1.在讨论这个问题之前首先介绍一下什么是"大数据量sql文件". 导出sql文件.选择数据库-----右击选择"转储SQL文件"-----选择"结构和 ...

  3. 以慕课网日志分析为例-进入大数据Spark SQL的世界

    下载地址.请联系群主 第1章 初探大数据 本章将介绍为什么要学习大数据.如何学好大数据.如何快速转型大数据岗位.本项目实战课程的内容安排.本项目实战课程的前置内容介绍.开发环境介绍.同时为大家介绍项目 ...

  4. 以某课网日志分析为例 进入大数据 Spark SQL 的世界

    第1章 初探大数据 本章将介绍为什么要学习大数据.如何学好大数据.如何快速转型大数据岗位.本项目实战课程的内容安排.本项目实战课程的前置内容介绍.开发环境介绍.同时为大家介绍项目中涉及的Hadoop. ...

  5. 【慕课网实战】一、以慕课网日志分析为例 进入大数据 Spark SQL 的世界

    课程整套CDH相关的软件下载地址:http://archive.cloudera.com/cdh5/cdh/5/ cdh-5.7.0 生产或者测试环境选择对应CDH版本时,一定要采用尾号是一样的版本 ...

  6. 【大数据面试】【项目开发经验】Hadoop、Flume、Kafka、Hive、MySQL、Sqoop、Azkaban、Spark

    主要内容:框架层面的调优.业务经验 一.Hadoop 1.Hadoop基准测试(HDFS的读写性能.MapReduce的计算能力测试) (1)测试内容:文件上传下载的时间 (2)服务器有几个硬盘插槽 ...

  7. 如何在IDEA里给大数据项目导入该项目的相关源码(博主推荐)(类似eclipse里同一个workspace下单个子项目存在)(图文详解)

    不多说,直接上干货! 如果在一个界面里,可以是单个项目 注意:本文是以gradle项目的方式来做的! 如何在IDEA里正确导入从Github上下载的Gradle项目(含相关源码)(博主推荐)(图文详解 ...

  8. [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.

    给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...

  9. 【大数据面试】Flink 04:状态编程与容错机制、Table API、SQL、Flink CEP

    六.状态编程与容错机制 1.状态介绍 (1)分类 流式计算分为无状态和有状态 无状态流针对每个独立事件输出结果,有状态流需要维护一个状态,并基于多个事件输出结果(当前事件+当前状态值) (2)有状态计 ...

  10. 【慕课网实战】九、以慕课网日志分析为例 进入大数据 Spark SQL 的世界

    即席查询普通查询 Load Data1) RDD DataFrame/Dataset2) Local Cloud(HDFS/S3) 将数据加载成RDDval masterLog = sc.textFi ...

随机推荐

  1. KingbaseES Create Index Concurrently 过程探究

    前言: 我们知道Oracle 可以通过create index online 在线创建索引,而不影响其他会话修改数据,但Oracle 实际在online 创建索引的最后一步,实际还是需要进行锁升级,申 ...

  2. 国民经济行业分类与代码(GB/T 4754-2017、GB/T 4754-2011、GB/T 4754-2002)数据下载

    2002_2011_2017国民经济行业分类与代码mysql数据四级分类文件.rar 内容:其中包含2002.2011.2017三年国民经济行业分类和代码的MySQL文件,每一个表的格式如下:例如第一 ...

  3. 5W1H聊开源之What——开源是什么?

    美国政治传播学家拉斯韦尔提出了5W传播模式,经过后人的不断运用和发展总结,形成了一套逐渐成熟的"5W1H"体系,即:对选定的项目.工序或操作,都要从原因(何因Why).对象(何事W ...

  4. #博弈论,贪心#AT2376 [AGC014D] Black and White Tree

    题目传送门 分析 考虑到先手放一个白点后手必将在相邻位置放一个黑点, 如果没有合适的位置放黑点先手必胜,也就是问是否存在完美匹配, 直接从叶子节点到根贪心匹配即可 代码 #include <cs ...

  5. Ascend C 自定义算子 Kernel Launch调用入门

    本文分享自华为云社区<Ascend C 自定义算子 Kernel Launch调用入门>,作者: jackwangcumt. 1 Kernel Launch概述 根据官方说明文档的介绍,A ...

  6. 官方直播丨“Hello Ability:从页面跳转开始”周三晚不见不散

    12月8日 19:00-20:30,Hello HarmonyOS系列课程的第四期"Hello Ability:从页面跳转开始"线上直播,将带你学习如何快速通过JS page间.A ...

  7. LTV预估的一些思考

    什么是LTV 用户生命周期价值(Lifetime Value, LTV)是一个非常重要的指标,定义为单个用户在某种生命周期内(i.e. 从开始使用产品到停止使用期间) 为产品创造的总价值. 比如GMV ...

  8. 结构化数据上的 TopN 运算

    1.     最大值 / 最小值 最大值 / 最小值可以理解为 TopN 查询中,N 等于 1 时的情况,因为很常用所以单独拿出来讲一下.取最大值 / 最小值是很常见的需求,例如一班数学最高分是多少, ...

  9. Java:得到指定年份、月份、周次的最后一天

    使用Java的工具类Calendar 通过Calendar可以进行很多的日期操作 /** * 得到指定年份的最后一天 * @param year */ public static void getLa ...

  10. leetcode每日一题:836. 矩形重叠

    836. 矩形重叠 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的 ...