首页 > 试题广场 >

牛客直播各科目同时在线人数

[编程题]牛客直播各科目同时在线人数
  • 热度指数:17642 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
牛客某页面推出了数据分析系列直播课程介绍。用户可以选择报名任意一场或多场直播课。
已知课程表course_tb如下(其中course_id代表课程编号,course_name表示课程名称,course_datetime代表上课时间):
course_id course_name course_datetime
1 Python 2021-12-1 19:00-21:00
2 SQL 2021-12-2 19:00-21:00
3 R 2021-12-3 19:00-21:00
上课情况表attend_tb如下(其中user_id表示用户编号、course_id代表课程编号、in_datetime表示进入直播间的时间、out_datetime表示离开直播间的时间):
user_id course_id in_datetime out_datetime
100 1 2021-12-01 19:00:00
2021-12-01 19:28:00
100 1 2021-12-01 19:30:00
2021-12-01 19:53:00
101 1 2021-12-01 19:00:00
2021-12-01 20:55:00
102 1 2021-12-01 19:00:00
2021-12-01 19:05:00
104 1 2021-12-01 19:00:00
2021-12-01 20:59:00
101 2 2021-12-02 19:05:00
2021-12-02 20:58:00
102 2 2021-12-02 18:55:00
2021-12-02 21:00:00
104 2 2021-12-02 18:57:00
2021-12-02 20:56:00
107 2 2021-12-02 19:10:00
2021-12-02 19:18:00
100 3 2021-12-03 19:01:00
2021-12-03 21:00:00
102 3 2021-12-03 18:58:00
2021-12-03 19:05:00
108 3 2021-12-03 19:01:00
2021-12-03 19:56:00
请你统计每个科目最大同时在线人数(按course_id排序),以上数据的输出结果如下:
course_id course_name max_num
1 Python 4
2 SQL 4
3 R 3
示例1

输入

drop table if exists course_tb;
CREATE TABLE course_tb(
course_id int(10) NOT NULL, 
course_name char(10) NOT NULL,
course_datetime char(30) NOT NULL);
INSERT INTO course_tb VALUES(1, 'Python', '2021-12-1 19:00-21:00');
INSERT INTO course_tb VALUES(2, 'SQL', '2021-12-2 19:00-21:00');
INSERT INTO course_tb VALUES(3, 'R', '2021-12-3 19:00-21:00');

drop table if exists attend_tb;
CREATE TABLE attend_tb(
user_id int(10) NOT NULL, 
course_id int(10) NOT NULL,
in_datetime datetime NOT NULL,
out_datetime datetime NOT NULL
);
INSERT INTO attend_tb VALUES(100, 1, '2021-12-1 19:00:00', '2021-12-1 19:28:00');
INSERT INTO attend_tb VALUES(100, 1, '2021-12-1 19:30:00', '2021-12-1 19:53:00');
INSERT INTO attend_tb VALUES(101, 1, '2021-12-1 19:00:00', '2021-12-1 20:55:00');
INSERT INTO attend_tb VALUES(102, 1, '2021-12-1 19:00:00', '2021-12-1 19:05:00');
INSERT INTO attend_tb VALUES(104, 1, '2021-12-1 19:00:00', '2021-12-1 20:59:00');
INSERT INTO attend_tb VALUES(101, 2, '2021-12-2 19:05:00', '2021-12-2 20:58:00');
INSERT INTO attend_tb VALUES(102, 2, '2021-12-2 18:55:00', '2021-12-2 21:00:00');
INSERT INTO attend_tb VALUES(104, 2, '2021-12-2 18:57:00', '2021-12-2 20:56:00');
INSERT INTO attend_tb VALUES(107, 2, '2021-12-2 19:10:00', '2021-12-2 19:18:00');
INSERT INTO attend_tb VALUES(100, 3, '2021-12-3 19:01:00', '2021-12-3 21:00:00');
INSERT INTO attend_tb VALUES(102, 3, '2021-12-3 18:58:00', '2021-12-3 19:05:00');
INSERT INTO attend_tb VALUES(108, 3, '2021-12-3 19:01:00', '2021-12-3 19:56:00');

输出

1|Python|4
2|SQL|4
3|R|3
头像 盐咸咸
发表于 2022-04-11 18:11:38
一、题目&解题步骤 题目:统计每个科目最大同时在线人数(按course_id排序) 又是一题求同时在线题。 解题思路,分三步走: 首先,取用户进入直播间,并赋值uv为1;取用户离开直播间,并赋值uv为-1;然后使用窗口函数计算直播间的瞬时用户数;最后,取 展开全文
头像 金牛座的怪蜀黍
发表于 2022-11-05 13:29:50
刚看到这个题目,作者表示一脸懵圈+满脸疑惑,啥?SQL还能求解这种问题,要求解这个问题,怎么确定同时在线的时间点?确定了时间点又怎么确定那时候在线人数有多少?想到这里,直接茫然加倍,因为题目中给的时间是一个横向的序列,他是一个横向的由时间段构成的时间轴,用户A,登录时间,退出时间,用户B,登录时间, 展开全文
头像 牛客149133483号
发表于 2022-04-04 18:18:22
解题思路: 反向推导, 正向执行 反向推导 获取各科目最大同时在线人数, 需要计算各科目每一个瞬间的同时在线人数, 再进行筛选 计算各科目每个瞬间的同在在线人数, 只需要计算截止每个瞬间的上线人数减去下线人数即可 计算截止每个瞬间的上线和下线人数, 只需要生成一个用户上线和下线的总表, 再根据科目 展开全文
头像 不想取名啊
发表于 2022-02-28 13:22:11
-- 链接 LINK: https://www.nowcoder.com/practice/d69677e41f9a4bf3b3ed7a42573e9490?tpId=268&tqId=2286245&ru=/exam/oj&qru=/ta/sql-factory-inter 展开全文
头像 校招找个好工作
发表于 2022-02-27 14:19:24
经典题做个标记 思路: 1.有in_datetime的时间说明有用户入场 为其标记为1 2.有out_datetime的时间说明有用户离场 为其标记为-1 3.将上述数据union起来后,使用窗口函数根据course_id进行分区,按照时间进行排序 4.最终取出最大值即为同时在线的人数 with t 展开全文
头像 酸菜鱼土豆大侠
发表于 2022-10-30 19:02:00
【场景】:同时在线人数 【分类】:窗口函数、分组查询、多表连接 分析思路 难点: 1.窗口函数和分组查询要分开求解 (1)统计进出记录表 注:进入是增加一个在线人数,出去是减少一个在线人数 [条件]:timestampdiff(minute,in_datetime,out_datetime) 展开全文
头像 在笔试的杰克很勤劳
发表于 2023-12-28 20:11:32
with zb as (select ct.course_id,ct.course_name,in_datetime,out_datetime,1 as in_num,-1 as leave_num /*将进入时间标记为1,离开记-1*/ from course_tb ct left join at 展开全文
头像 牛客90585398号
发表于 2022-02-27 21:40:58
select ct.course_id,course_name,max(dt) from (select user_id,course_id, sum(diff) over(partition by course_id order by dt) as dt from (select user_id, 展开全文
头像 烛少
发表于 2022-01-19 21:20:45
with st as ( select course_id,in_datetime from attend_tb at group by course_id,in_datetime ) select a.course_id,course_name,max(cnt) max_n 展开全文
头像 大数据比卡丘
发表于 2022-10-10 14:42:11
with temp as(   select     user_id,     attend_tb.course_id,   展开全文

问题信息

难度:
119条回答 947浏览

热门推荐

通过挑战的用户

查看代码
  • 二维码

    扫描二维码,关注牛客网

  • 二维码

    下载牛客APP,随时随地刷题