sql笔记:直播间最大人数

DROP TABLE if exists SQL_13;
CREATE TABLE SQL_13(
   user_id INT,
   live_id INT,
   in_time DATETIME NOT NULL,
   out_time DATETIME NOT NULL
);
insert into SQL_13(user_id,live_id,in_time,out_time)
values (0001,1,'2023-01-01 10:00:00','2023-01-01 11:00:00');
insert into SQL_13(user_id,live_id,in_time,out_time)
values (0002,2,'2023-01-01 15:00:00','2023-01-01 16:30:00');
insert into SQL_13(user_id,live_id,in_time,out_time)
values (0003,1,'2023-01-01 10:20:00','2023-01-01 10:30:00');
insert into SQL_13(user_id,live_id,in_time,out_time)
values (0004,1,'2023-01-01 09:20:00','2023-01-01 11:30:00');
insert into SQL_13(user_id,live_id,in_time,out_time)
values (0005,2,'2023-01-01 11:20:00','2023-01-01 14:30:00');
insert into SQL_13(user_id,live_id,in_time,out_time)
values (0006,2,'2023-01-01 12:20:00','2023-01-01 15:30:00');
insert into SQL_13(user_id,live_id,in_time,out_time)
values (0007,1,'2023-01-01 08:20:00','2023-01-01 09:30:00');
insert into SQL_13(user_id,live_id,in_time,out_time)
values (0008,2,'2023-01-01 08:20:00','2023-01-01 12:30:00');
insert into SQL_13(user_id,live_id,in_time,out_time)
values (0009,1,'2023-01-01 15:20:00','2023-01-01 19:30:00');
insert into SQL_13(user_id,live_id,in_time,out_time)
values (0010,2,'2023-01-01 09:20:00','2023-01-01 13:30:00');
select * from SQL_13;

在这里插入图片描述
思路:
在这里插入图片描述

首先转换成如下的表格:
在这里插入图片描述
代码是

select user_id,live_id,in_time as dt ,1 as cnt from sql_13 
UNION
select user_id,live_id,out_time as dt,-1 as cnt from sql_13
ORDER BY live_id,dt;

然后使用窗口函数,用live_id固定窗口,order by dt为浮动窗口对cnt进行累加。
在这里插入图片描述

with t1 as(
select user_id,live_id,in_time as dt ,1 as cnt from sql_13 
UNION
select user_id,live_id,out_time as dt,-1 as cnt from sql_13
ORDER BY live_id,dt)
select *,
sum(cnt) over(PARTITION BY live_id order by dt) as 人数
from t1;

最后只需要对live_id分组,求max(人数)即可。

with t1 as(
select user_id,live_id,in_time as dt ,1 as cnt from sql_13 
UNION
select user_id,live_id,out_time as dt,-1 as cnt from sql_13
ORDER BY live_id,dt),
t2 as(
select *,
sum(cnt) over(PARTITION BY live_id order by dt) as 人数
from t1)
select live_id,max(人数) from t2 GROUP BY live_id ;

在这里插入图片描述
参考b站讲解:
link

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值