牛客SQL34: 牛客直播各科目同时在线人数(最大值问题)

您所在的位置:网站首页 直播间的在线人数 牛客SQL34: 牛客直播各科目同时在线人数(最大值问题)

牛客SQL34: 牛客直播各科目同时在线人数(最大值问题)

2024-06-22 09:16| 来源: 网络整理| 查看: 265

牛客SQL34: 牛客直播各科目同时在线人数(最大值问题)

内容目录 牛客SQL34: 牛客直播各科目同时在线人数(最大值问题)一、描述二、思路解析三、代码四、问题思考

一、描述

牛客某页面推出了数据分析系列直播课程介绍。用户可以选择报名任意一场或多场直播课。

已知课程表course_tb如下(其中course_id代表课程编号,course_name表示课程名称,course_datetime代表上课时间):

course_idcourse_namecourse_datetime1Python2021-12-1 19:00-21:002SQL2021-12-2 19:00-21:003R2021-12-3 19:00-21:00

上课情况表attend_tb如下(其中user_id表示用户编号、course_id代表课程编号、in_datetime表示进入直播间的时间、out_datetime表示离开直播间的时间):

user_idcourse_idin_datetimeout_datetime10012021-12-01 19:00:002021-12-01 19:28:0010012021-12-01 19:30:002021-12-01 19:53:0010112021-12-01 19:00:002021-12-01 20:55:0010212021-12-01 19:00:002021-12-01 19:05:0010412021-12-01 19:00:002021-12-01 20:59:0010122021-12-02 19:05:002021-12-02 20:58:0010222021-12-02 18:55:002021-12-02 21:00:0010422021-12-02 18:57:002021-12-02 20:56:0010722021-12-02 19:10:002021-12-02 19:18:0010032021-12-03 19:01:002021-12-03 21:00:0010232021-12-03 18:58:002021-12-03 19:05:0010832021-12-03 19:01:002021-12-03 19:56:00

请你统计每个科目最大同时在线人数(按course_id排序),以上数据的输出结果如下:

course_idcourse_namemax_num1Python42SQL43R3 二、思路解析

这其实是一个瞬时最大值问题,解题详情见sql解决连续问题

这类题的解析步骤可以分为以下

找到数量变化的时间点,比如进入直播间和退出直播间等对数量变化做出相应的+1和-1操作按照题目规定对某个字段分组排序开窗求和,获取最大值 三、代码 -- 1. 处理人数增减 with t1 as ( select tt.course_id ,course_name ,in_datetime event_time ,1 as cnt from attend_tb tt left join course_tb using(course_id) union all select tt.course_id ,course_name ,out_datetime event_time ,-1 as cnt from attend_tb tt left join course_tb using(course_id) ), -- 2. 按照course_id分组 t2 as ( select course_id ,course_name ,event_time ,sum(cnt) over(partition by course_id order by event_time) online_cnt from t1 ) select course_id ,course_name ,max(online_cnt) max_num from t2 group by course_id, course_name order by course_id 四、问题思考 sum(column3) over(partition by column1 order by column2) 和 sum(column3) over(partition by column1 order by column2 rows between unbounded preceding and current row)

上述两者的区别

准备数据,向表里增加一些测试数据,不用太多

-- 创建表 create table user_tb( user_id string, score int ); -- 插入数据 insert into user_tb values('1001',1), ('1001',10), ('1001',100);

测试1:

select user_id ,score ,sum(score) over(partition by user_id order by score) from user_tb;

在这里插入图片描述

测试2:

select user_id ,score ,sum(score) over(partition by user_id order by score rows between unbounded preceding and current row) from user_tb;

在这里插入图片描述

这里可以看出,这两个用法的结果其实是一样的,只是中间的计算逻辑不同



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3