SQL题解之使用union和sum解决同时在线人数问题

现有各直播间的用户访问记录表(live_events)如下,表中每行数据表达的信息为,一个用户何时进入了一个直播间,又在何时离开了该直播间。

user_id (用户id) live_id (直播间id) in_datetime (进入直播间的时间) out_datetime (离开直播间的时间)
100 1 2021-12-1 19:30:00 2021-12-1 19:53:00
100 2 2021-12-1 21:01:00 2021-12-1 22:00:00
101 1 2021-12-1 19:05:00 2021-12-1 20:55:00

现要求统计各直播间最大同时在线人数,期望结果如下:

live_id <int> (直播id) max_user_count <int> (最大人数)
1 4
2 3
3 2

--- 1.计算逻辑

对于同时在线人数问题,可以把数据进行处理后,然后将出入时间变成一个字段,同时打上标记为1或-1表示进入离开直播间,同时使用sum()函数累加这个字段,最大值为峰值人数

-- 1.对数据进行处理

in_datetime dt, out_datetime dt 设置为时间日期字段,同时打上进入出去标记1,-1

-- 2.union成一个字段
sql 复制代码
     select
        live_id,
        in_datetime dt,
        1 flag
    from live_events
    union all
    select 
        live_id,
        out_datetime,
        -1
    from live_events
-- 3.使用sum over()开窗函数累加人数

按照直播间分区并按照时间进行排序

sql 复制代码
 sum(flag) over(partition by live_id order by dt asc) as ct
--4. 求最大的人数

按照直播间分组,求最大人数

sql 复制代码
 max(ct) as  max_user_count
group by live_id
-- 5.最终SQL
sql 复制代码
select
	live_id,
    max(ct) as  max_user_count
from 
(
  select
      live_id,
      dt,
      sum(flag) over(partition by live_id order by dt asc) as ct
  from 
  (
    select
        live_id,
        in_datetime dt,
        1 flag
    from live_events
    union all
    select 
        live_id,
        out_datetime,
        -1
    from live_events
  )t1
)t2
group by live_id
相关推荐
毛驴赶鹿1 天前
【金仓数据库征文】KES V9性能调优实战记录:从慢SQL排查到全链路优化
数据库·sql
山峰哥1 天前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
刘婉晴1 天前
【Web漏洞】SQL 注入实战技巧
前端·数据库·sql
Csvn1 天前
📊 SQL 入门 Day 13:窗口函数进阶
后端·sql
AI推荐率1 天前
品牌AI可见度监测报告生成:Python + SQL + Jinja2 自动化实践
人工智能·python·sql
爱喝水的鱼丶2 天前
SAP-ABAP:调试器高级工具使用——内表分析、SQL追踪、内存检查功能实操
运维·sql·性能优化·sap·abap·经验交流
Csvn2 天前
📊 SQL 入门 Day 12: 窗口函数基础
后端·sql
安_2 天前
MySQL SQL 调优完整指南
数据库·sql·mysql
我命由我123453 天前
SQLite 数据库参数数量超限导致的崩溃问题:SQLiteException: too many SQL variables
java·数据库·sql·java-ee·sqlite·android-studio·android runtime
Lethehong3 天前
【金仓数据库征文】AI 直连国产数据库——KES MCP Server 自然语言查库与 SQL 调优实战
数据库·人工智能·sql·金仓数据库征文