同时在限人数(同时在线最大人数)

同时在线最大人数

问题:
现有直播间时间表, 记录用户id和直播间id,以及何时进入直播间,何时离开直播间
求个直播间最大同时在线人数是多少

1. 数据准备
-- 数据准备
-- user_id(用户编号), live_id(直播间编号), in_time(进入直播间时间), out_time(离开直播间时间)
WITH live_events AS (
SELECT * FROM (
  VALUES    (100, 1, '2023-11-21 19:00:00', '2023-11-21 19:28:00'),
            (100, 1, '2023-11-21 19:30:00', '2023-11-21 19:53:00'),
            (100, 2, '2023-11-21 21:01:00', '2023-11-21 22:00:00'),
            (101, 1, '2023-11-21 19:05:00', '2023-11-21 20:55:00'),
            (101, 2, '2023-11-21 21:05:00', '2023-11-21 21:58:00'),
            (102, 1, '2023-11-21 19:10:00', '2023-11-21 19:25:00'),
            (102, 2, '2023-11-21 19:55:00', '2023-11-21 21:00:00'),
            (102, 3, '2023-11-21 21:05:00', '2023-11-21 22:05:00'),
            (104, 1, '2023-11-21 19:00:00', '2023-11-21 20:59:00'),
            (104, 2, '2023-11-21 21:57:00', '2023-11-21 22:56:00'),
            (105, 2, '2023-11-21 19:10:00', '2023-11-21 19:18:00'),
            (106, 3, '2023-11-21 19:01:00', '2023-11-21 21:10:00')
) AS table_name(user_id, live_id, in_time, out_time)
)
2. 代码实现
-- 1. 将进入和离开直播间时间合成一列, 并做标记
SELECT 
      user_id, live_id, in_time AS in_out_time, 1 AS tab -- 1 代表有1人在,-1表示离开一人
FROM live_events
UNION ALL 
SELECT 
      user_id, live_id, out_time AS in_out_time, -1 AS tab -- 1 代表有1人在,-1表示离开一人
FROM live_events
;
user_idlive_idin_out_timetab
10012023-11-21 19:00:001
10412023-11-21 19:00:001
10632023-11-21 19:01:001
10112023-11-21 19:05:001
10212023-11-21 19:10:001
10522023-11-21 19:10:001
10522023-11-21 19:18:00-1
10212023-11-21 19:25:00-1
10012023-11-21 19:28:00-1
10012023-11-21 19:30:001
10012023-11-21 19:53:00-1
10222023-11-21 19:55:001
-- 2. 统计每个时间段, 同时在线人数
SELECT 
      user_id, live_id, in_out_time
    , SUM(tab) OVER(PARTITION BY live_id ORDER BY in_out_time ) AS user_count 
FROM (
    SELECT 
          user_id, live_id, in_time AS in_out_time, 1 AS tab -- 1 代表有1人在,-1表示离开一人
    FROM live_events
    UNION ALL 
    SELECT 
          user_id, live_id, out_time AS in_out_time, -1 AS tab -- 1 代表有1人在,-1表示离开一人
    FROM live_events
) a
;
user_idlive_idin_out_timeuser_count
10012023-11-21 19:00:001
10412023-11-21 19:00:002
10112023-11-21 19:05:003
10212023-11-21 19:10:004
10212023-11-21 19:25:003
10012023-11-21 19:28:002
10012023-11-21 19:30:003
-- 3. 取出每个直播间, 同时在线最大人数
SELECT 
      live_id, MAX(user_count) AS max_user_count 
FROM (
    SELECT 
          user_id, live_id, in_out_time
        , SUM(tab) OVER(PARTITION BY live_id ORDER BY in_out_time ) AS user_count 
    FROM (
        SELECT 
              user_id, live_id, in_time AS in_out_time, 1 AS tab -- 1 代表有1人在,-1表示离开一人
        FROM live_events
        UNION ALL 
        SELECT 
              user_id, live_id, out_time AS in_out_time, -1 AS tab -- 1 代表有1人在,-1表示离开一人
        FROM live_events
    ) a
) b
GROUP BY live_id
;
live_idmax_user_count
14
23
32
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值