大数据面试SQL(三):每分钟在线直播人数

文章目录

每分钟在线直播人数

一、题目

二、分析

三、SQL实战

四、样例数据参考


每分钟在线直播人数

一、题目

有如下数据记录直播平台主播上播及下播时间,根据该数据计算出平台每分钟的在线直播人数。

这里用主播名称做统计,前提是主播名称唯一,不能出现重复,平台有名称重复验证。

样例数据:

目标结果:

截取部分数据

需要每分钟都要显示人数,哪怕只有0的数据也要显示,不能出现以下结果。

二、分析

查询每分钟在线人数,这里处理逻辑基本和最高峰在线人数是一致的,但有一个问题,如果某一分钟内无任何操作记录,则不会出现该分钟的数据,我们就统计不到。所以这里额外考察了生成数据。

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

三、SQL实战

1、首先对原始数据进行处理,生成主播上下播的日志数据,同时增加人数变化字段,主播上播为1,主播下播-1。新数据包含 user_name,action_time,change_cnt。

查询语句:

sql 复制代码
--开播记录
select
user_name,
start_time as action_time,
1 as change_cnt
from t2_livestream_log
union all 
--下播记录
select
user_name,
end_time as action_time,
-1 as change_cnt
from t2_livestream_log

查询结果:

截取部分数据

2、生成0~24*60-1条记录数据

查询语句:

sql 复制代码
select idx from (select posexplode(split(space(24*60),' ')) as (idx,value)) t;

查询结果:

截取部分数据

3、根据以上SQL生成每分钟一条记录的心跳记录,心跳记录change_cnt= 0,代表没有主播上播,也没有主播下播。

查询语句:

sql 复制代码
SELECT
    '' as user_name,
    from_unixtime(unix_timestamp('2024-06-29','yyyy-MM-dd')+item*60,'yyyy-MM-dd HH:mm:ss') as action_time,
    0 as change_cnt
from (select posexplode(split(space(24*60),' ')) as (item,value)) t
union all 
SELECT
    ''  as user_name,
    from_unixtime(unix_timestamp('2024-06-30','yyyy-MM-dd')+item*60,'yyyy-MM-dd HH:mm:ss') as action_time,
    0 as change_cnt
from (select posexplode(split(space(24*60),' ')) as (item,value)) t

查询结果:

截取部分数据

4、汇总所有数据之后,对change_cnt累积求和,然后求出每分钟的最大值即可。

查询语句:

sql 复制代码
with t_all as(
--开播记录
select
user_name,
start_time as action_time,
1 as change_cnt
from t2_livestream_log
union all 
--下播记录
select
user_name,
end_time as action_time,
-1 as change_cnt
from t2_livestream_log
--心跳数据
union all
SELECT
    '' as user_name,
    from_unixtime(unix_timestamp('2024-06-29','yyyy-MM-dd')+item*60,'yyyy-MM-dd HH:mm:ss') as action_time,
    0 as change_cnt
from (select posexplode(split(space(24*60),' ')) as (item,value)) t
union all 
SELECT
    '' as user_name,
    from_unixtime(unix_timestamp('2024-06-30','yyyy-MM-dd')+item*60,'yyyy-MM-dd HH:mm:ss') as action_time,
    0 as change_cnt
from (select posexplode(split(space(24*60),' ')) as (item,value)) t
)
select
    date_format(action_time,'yyyy-MM-dd HH:mm') as act_minute,
    max(online_cnt) as minute_max_cnt
from (select user_name,
             action_time,
             change_cnt,
             sum(change_cnt) over (order by action_time asc) online_cnt
      from t_all
      )t1
group by date_format(action_time,'yyyy-MM-dd HH:mm')
;

查询结果:

截取部分数据

四、样例数据参考

sql 复制代码
CREATE TABLE IF NOT EXISTS t2_livestream_log (
    user_name STRING, -- 主播名称
    start_time STRING, -- 开始时间
    end_time STRING -- 结束时间
);
 
insert into t2_livestream_log(user_name, start_time, end_time) values
('亚瑟','2024-06-29 01:00:00','2024-06-29 02:01:05'),
('曹操','2024-06-29 01:05:00','2024-06-29 02:03:18'),
('孙悟空','2024-06-29 02:00:00','2024-06-29 04:03:22'),
('花木兰','2024-06-29 03:15:07','2024-06-29 04:33:21'),
('露娜','2024-06-29 03:34:16','2024-06-29 06:10:45'),
('云缨','2024-06-29 05:22:00','2024-06-29 07:01:08'),
('姬小满','2024-06-29 06:11:03','2024-06-29 09:26:05'),
('哪吒','2024-06-29 08:00:00','2024-06-29 12:34:27'),
('亚瑟','2024-06-29 11:00:00','2024-06-29 16:03:18'),
('沈梦溪','2024-06-29 15:00:00','2024-06-29 17:01:05'),
('姜子牙','2024-06-30 01:00:00','2024-06-30 02:01:05'),
('高渐离','2024-06-30 01:05:00','2024-06-30 02:03:18'),
('张良','2024-06-30 02:00:00','2024-06-30 04:03:22'),
('甄姬','2024-06-30 03:15:07','2024-06-30 04:33:21'),
('金蝉','2024-06-30 03:34:16','2024-06-30 06:10:45'),
('鲁班七号','2024-06-30 05:22:00','2024-06-30 07:01:08'),
('后羿','2024-06-30 06:11:03','2024-06-30 09:26:05'),
('哪吒','2024-06-30 08:00:00','2024-06-30 12:34:27'),
('鲁班七号','2024-06-30 11:00:00','2024-06-30 16:03:18'),
('后羿','2024-06-30 15:00:00','2024-06-30 17:01:05');

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨
相关推荐
TM1Club4 小时前
AI驱动的预测:新的竞争优势
大数据·人工智能·经验分享·金融·数据分析·自动化
zhang133830890754 小时前
CG-09H 超声波风速风向传感器 加热型 ABS材质 重量轻 没有机械部件
大数据·运维·网络·人工智能·自动化
电商API_180079052475 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
龙山云仓5 小时前
No140:AI世间故事-对话康德——先验哲学与AI理性:范畴、道德律与自主性
大数据·人工智能·深度学习·机器学习·全文检索·lucene
躺柒6 小时前
读数字时代的网络风险管理:策略、计划与执行04风险指引体系
大数据·网络·信息安全·数字化·网络管理·网络风险管理
我真的是大笨蛋7 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
独自归家的兔8 小时前
从 “局部凑活“ 到 “全局最优“:AI 规划能力的技术突破与产业落地实践
大数据·人工智能
海域云-罗鹏8 小时前
国内公司与英国总部数据中心/ERP系统互连,SD-WAN专线实操指南
大数据·数据库·人工智能
策知道9 小时前
依托政府工作报告准备省考【经验贴】
大数据·数据库·人工智能·搜索引擎·政务
Henry-SAP9 小时前
SAP(ERP) 组织结构业务视角解析
大数据·人工智能·sap·erp·sap pp