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;
查看15道真题和解析