SQL同时在线问题

原链接(我抄的)

https://kpretty.tech/archives/sql4

需求:求直播同时在线人数的最大值

原数据

select * from online_problem;

| online_problem.id  |  online_problem.stt  |  online_problem.edt  |
+--------------------+----------------------+----------------------+
| 1001               | 2021-06-14 12:12:12  | 2021-06-14 18:12:12  |
| 1003               | 2021-06-14 13:12:12  | 2021-06-14 16:12:12  |
| 1004               | 2021-06-14 13:15:12  | 2021-06-14 20:12:12  |
| 1002               | 2021-06-14 15:12:12  | 2021-06-14 16:12:12  |
| 1005               | 2021-06-14 15:18:12  | 2021-06-14 20:12:12  |
| 1001               | 2021-06-14 20:12:12  | 2021-06-14 23:12:12  |
| 1006               | 2021-06-14 21:12:12  | 2021-06-14 23:15:12  |
| 1007               | 2021-06-14 22:12:12  | 2021-06-14 23:10:12  |

思路(流处理做法)

主播上线就 +1,有主播下线就 -1。那对于上述数据我们可以按上线下线时间拆分同时拓展一个字段,如果是上线就是 1,下线就是 -1,最后按照时间排序按行求和即可找出最大的直播人数

第一步

select id, stt dt, 1 flag
from online_problem t
	 union
select id, edt dt, -1 flag
from online_problem t;

在这里插入图片描述

第二步(按时间排序,累加flag到当前行)

select id,dt,sum(flag) over (order by dt) crs
from (
 select id, stt dt, 1 flag
 from online_problem t
 	union
 select id, edt dt, -1 flag
 from online_problem t
) t1;

在这里插入图片描述

第三步(最后求个max就完事了)

select max(crs)
from (
	select id, dt, sum(flag) over (order by dt) crs
	from (
		select id, stt dt, 1 flag
		from online_problem t
			union
		select id, edt dt, -1 flag
		from online_problem t
	) t1
) t2;

在这里插入图片描述

解释

在这里插入图片描述
第一个绿色框框里两个用户同时下线,所以5-2等于3;第二个绿色框框里的三个时间相同,是下播、开播、下播,这三个1是这样计算得出来的(2-1+1-1),时间相同的作为一个窗口。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值