sql笔试题:计算直播间各个时间段在线人数

您所在的位置:网站首页 直播间人数最多的记录是什么 sql笔试题:计算直播间各个时间段在线人数

sql笔试题:计算直播间各个时间段在线人数

2024-07-09 14:29| 来源: 网络整理| 查看: 265

一、题目:计算直播间各个时间段在线人数

直播间观看记录如下:

live_id (直播间编号)user_id(用户编号)start_time(进入直播间时间)end_time(离开直播间时间)AU12023-11-22 12:12:122023-11-22 13:13:13AU22023-11-22 12:20:202023-11-22 13:40:40…………

期望结果:

live_id(直播间编号)start_time(时间段开始时间)end_time(时间段结束时间)user_cnt(在线用户数)A2023-11-22 12:12:122023-11-22 12:20:201A2023-11-22 12:20:202023-11-22 13:13:132A2023-11-22 13:13:132023-11-22 13:40:401 二、题目分析

结合直播间记录和期望结果,需要考虑各个用户进入直播间、离开直播间的时间,将最近的进入时间和最近的离开时间拼接为某个时间段,如u1的进入拼u2的进入为第一时间段,u2的进入拼u1的离开为第二时间段等等,结合用户在直播间的时间,计算每个时间段的人数。

三、准备工作 --创建直播记录表 CREATE TABLE test_live ( live_id STRING COMMENT '直播间编号' ,user_id STRING COMMENT '用户编号' ,start_time DATETIME COMMENT '进入直播间时间' ,end_time DATETIME COMMENT '离开直播间时间' ) ; --写入测试数据 INSERT INTO test_live VALUES ('A','U1','2023-11-22 12:12:12','2023-11-22 13:13:13') ,('A','U2','2023-11-22 12:20:20','2023-11-22 13:40:40') ;

测试数据:

live_id user_id start_time end_time A U1 2023-11-22 12:12:12 2023-11-22 13:13:13 A U2 2023-11-22 12:20:20 2023-11-22 13:40:40

四、解题分析

4.1、获取直播间各个时间

SELECT live_id ,start_time as times FROM test_live UNION ALL SELECT live_id ,end_time FROM test_live ; -- 对应结果: -- live_id times -- A 2023-11-22 13:13:13 -- A 2023-11-22 13:40:40 -- A 2023-11-22 12:12:12 -- A 2023-11-22 12:20:20

4.2、将1获取的时间,按照相邻的方式,拼接为时间段 2-1 将时间按升序打上编号

SELECT live_id ,times ,ROW_NUMBER() OVER(ORDER BY times) rn FROM ( SELECT live_id ,start_time AS times FROM test_live UNION ALL SELECT live_id ,end_time FROM test_live ) tmp1 ; -- 对应结果: -- live_id times rn -- A 2023-11-22 12:12:12 1 -- A 2023-11-22 12:20:20 2 -- A 2023-11-22 13:13:13 3 -- A 2023-11-22 13:40:40 4

2-2 将编号差一的拼接成时间段 为避免后续代码量过长,此处将结果创建临时表

--drop table temp22; --create table temp22 as SELECT distinct tmp221.live_id ,tmp221.times AS start_time ,tmp222.times AS end_time FROM ( SELECT live_id ,times ,ROW_NUMBER() OVER(ORDER BY times) rn FROM ( SELECT live_id ,start_time AS times FROM test_live UNION ALL SELECT live_id ,end_time FROM test_live ) tmp211 ) tmp221 inner JOIN ( SELECT live_id ,times ,ROW_NUMBER() OVER(ORDER BY times) rn FROM ( SELECT live_id ,start_time AS times FROM test_live UNION ALL SELECT live_id ,end_time FROM test_live ) tmp211 ) tmp222 ON tmp221.live_id = tmp222.live_id AND tmp221.rn = (tmp222.rn - 1) ; -- 对应结果: -- live_id start_time end_time -- A 2023-11-22 12:12:12 2023-11-22 12:20:20 -- A 2023-11-22 12:20:20 2023-11-22 13:13:13 -- A 2023-11-22 13:13:13 2023-11-22 13:40:40

4.3、用户进入直播间开始时间、结束时间符合某个时间段统计要求,则在线人数记为1 分析:将红框看做统计时间段,用1-6个箭头代表用户在线时间与统计时间差的交集,其中1表示从上线到下线未进入直播间。那么我们要统计的目标用户为2,3,4,5。分析共同特点为用户下线时间大于统计开始时间段,用户上线时间早于统计时间段结束时间。 在这里插入图片描述

SELECT live_id ,start_time ,end_time ,COUNT(DISTINCT user_id) FROM ( SELECT a.live_id ,a.start_time ,a.end_time ,CASE WHEN ( b.start_time a.start_time ) THEN b.user_id END AS user_id FROM temp22 a LEFT JOIN test_live b ON a.live_id = b.live_id ) temp GROUP BY live_id ,start_time ,end_time ; -- 对应结果: -- live_id start_time end_time user_cnt -- A 2023-11-22 12:12:12 2023-11-22 12:20:20 1 -- A 2023-11-22 12:20:20 2023-11-22 13:13:13 2 -- A 2023-11-22 13:13:13 2023-11-22 13:40:40 1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3