SQL同时在线问题

题目描述:计算每个直播间 同时在线用户的最大数量(即峰值)。

输入示例表(lives 表)

id

live_id

visitor_id

start_time

end_time

1

101

1001

2023-10-01 08:00:00

2023-10-01 10:00:00

2

101

1002

2023-10-01 09:00:00

2023-10-01 11:00:00

3

101

1003

2023-10-01 09:30:00

2023-10-01 10:30:00

4

102

2001

2023-10-01 08:00:00

2023-10-01 09:00:00

5

102

2002

2023-10-01 08:30:00

2023-10-01 09:30:00

6

103

3001

2023-10-01 12:00:00

2023-10-01 13:00:00

7

103

3002

2023-10-01 14:00:00

2023-10-01 15:00:00

预期输出结果

live_id

max_online_users

101

3

102

2

103

1

思路:

1.将start_time和end_time拆分并使用UNION ALL自连接

2.使用窗口函数SUM() OVER (...)按直播间分组并按时间顺序累加事件值

3.对live_id进行分组,对实时在线人数取最大值

WITH a AS (
  SELECT id, live_id, visitor_id, start_time AS event_time, 1 AS cnt
  FROM lives
  UNION ALL
  SELECT id, live_id, visitor_id, end_time AS event_time, -1 AS cnt
  FROM lives
),
b AS (
  SELECT 
    *,
    SUM(cnt) OVER (
      PARTITION BY live_id 
      ORDER BY event_time
    ) AS cur_cnt
  FROM a
)
SELECT live_id, MAX(cur_cnt) AS max_cnt
FROM b
GROUP BY live_id;

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务