本文主要是介绍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成一个字段
selectlive_id,in_datetime dt,1 flagfrom live_eventsunion allselect live_id,out_datetime,-1from live_events
-- 3.使用sum over()开窗函数累加人数
按照直播间分区并按照时间进行排序
sum(flag) over(partition by live_id order by dt asc) as ct
--4. 求最大的人数
按照直播间分组,求最大人数
max(ct) as max_user_count
group by live_id
-- 5.最终SQL
selectlive_id,max(ct) as max_user_count
from
(selectlive_id,dt,sum(flag) over(partition by live_id order by dt asc) as ctfrom (selectlive_id,in_datetime dt,1 flagfrom live_eventsunion allselect live_id,out_datetime,-1from live_events)t1
)t2
group by live_id
这篇关于SQL题解之使用union和sum解决同时在线人数问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!