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

2023-11-11

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

一、描述

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

已知课程表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

二、思路解析

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

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

  1. 找到数量变化的时间点,比如进入直播间和退出直播间等
  2. 对数量变化做出相应的+1和-1操作
  3. 按照题目规定对某个字段分组排序开窗求和,获取最大值

三、代码

-- 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;

在这里插入图片描述

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • scala/spark 代码不允许在 hive 中添加列

    如果源数据有新列 我尝试在 Hive 表中添加一列 所有新列的检测都运行良好 但是 当我尝试将列添加到目标表时 我收到此错误 for f lt df schema fields if f name chk spark sqlContext
  • 连接多个表的查询执行速度慢

    我有以下表格 Parts id int idx partnumber varchar idx accountnumber idx enabled Sample data RefUserGroup id int idx value varch
  • 在cakephp 3中动态更改数据库连接

    我正在尝试更改中使用的数据库连接蛋糕php 3在飞行中 我找到的这个问题的每个答案都指的是蛋糕PHP 2 These https stackoverflow com questions 27655613 multiple databases
  • 如何调试 MySQL 存储过程?

    我当前的调试存储过程的过程非常简单 我创建一个名为 debug 的表 在存储过程运行时从其中插入变量值 这允许我查看脚本中给定点的任何变量的值 但是有没有更好的方法来调试 MySQL 存储过程 下列debug msg可以调用过程来简单地将调
  • MySQL Match() Against() 区分大小写

    目前 我的数据库是字符集Latin1意义 SELECT FROM TABLE MATCH column1 AGAINST words here IN BOOLEAN MODE 只会返回不敏感的搜索 但问题是我的数据库将通过不敏感和区分大小写
  • Mysql - Mysql2::错误:字符串值不正确:

    所以我建造了一个刮刀并拉动一些物体 问题是有些是外语 它使 mysql 数据库有点崩溃 这是我得到的错误 知道我能用这个做什么吗 谢谢 Mysql2 错误 列的字符串值不正确 xC5 x8Dga 第 1 行的 描述 插入sammiches
  • Codeigniter 加入多个条件

    我正在使用 Codeigniter Active Records 课程 我想加入我的users与我的桌子clients表 这样我就可以显示用户的 真实 姓名 而不仅仅是他们的 ID 这是什么clients表看起来像 示例 列 a 1 a 2
  • MySQL InnoDB 查询性能

    我正在尝试优化一个简单的 sql 查询 该查询将多次运行大量数据 这是场景 MySQL 与 InnoDB 表 where 和 join 中使用的所有字段都已索引 表有 FK 我不需要查询的整个缓存 但每个表的缓存是可能的 表有更多的更新 插
  • MySQL 按主键排序

    某些 SQL 服务器允许使用通用语句 例如ORDER BY PRIMARY KEY 我不相信这适用于 MySQL 是否有任何此类解决方法可以允许跨多个表自动选择 或者是否需要查找查询来确定主键 我一直在研究的解决方法包括调用SHOW COL
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 单行的总和值?

    我有一个 MySQL 查询 它返回由一系列 1 和 0 组成的单行 它用于进度条指示器 我现在在代码中对它进行求和 但我尝试对查询中的值求和 并意识到我无法使用 SUM 因为它们有很多列 但只有一行 有没有办法可以在查询中自动求和 就像这样
  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • 在 MacOSX10.6 上运行 python 服务器时 MySQLdb 错误

    运行我的服务器 python manage py runserver 产生以下错误 django core exceptions ImproperlyConfigured 加载 MySQLdb 模块时出错 没有名为 MySQLdb 的模块
  • 将记录分成两列

    我的数据库中有一个 学生 表 其中包含大约 5 000 条记录 我想将这些记录显示在two分区 如何在不执行查询两次的情况下做到这一点 仅使用单个查询 显示示例http www freeimagehosting net uploads f1
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • 使 pdo::query 静态

    当我运行下面的代码时出现此错误 我通常使用 msql 函数 但我尝试使用 PDO 代替 怎么了 致命错误 第 14 行无法静态调用非静态方法 PDO query
  • Python:如何使用生成器来避免 sql 内存问题

    我有以下方法来访问 mysql 数据库 并且查询在服务器中执行 我无权更改有关增加内存的任何内容 我对生成器很陌生 并开始阅读更多有关它的内容 并认为我可以将其转换为使用生成器 def getUNames self globalUserQu
  • MYSQL - 查找最近的前一天

    我可以以某种方式 不使用 PHP 找到一周中最近的前一天日期吗 Like 最近的上一个星期二的日期是哪一天 CURDATE INTERVAL WEEKDAY CURDATE wday IF WEEKDAY CURDATE gt wday 0
  • 如何在 Laravel 查询中使用多个 OR,AND 条件

    我需要 Laravel 查询帮助 我的自定义查询 返回正确结果 Select FROM events WHERE status 0 AND type public or type private 如何写这个查询Laravel Event w

随机推荐

  • 联表查询和嵌套查询—读懂数据库仓储

    数据仓储不像java C JS等开发语言 而是数据库仓储更多用于对接产品工作 查询数据 分析数据 得出产品未来发展方向 与产品经理相关联 而联表查询和嵌套查询作为数据库基础的查询方法 学习使用 方便技术人员从数据库的角度收集数据 给产品经理
  • 配置Sub-VLAN跨交换机的Super-VLAN

    示例图 一 实验目的 1 Sub VLAN跨交换机的Super VLAN 二 注意事项 1 必须先创建配置每个sub vlan 再创建 配置Super vlan 2 当Super vlan开启了 VLAN内ARP代理功能时 各个sub vl
  • java定义一个全局map_Java中关于Map的九大问题

    通常来说 Map是一个由键值对组成的数据结构 且在集合中每个键是唯一的 下面就以K和V来代表键和值 来说明一下java中关于Map的九大问题 1 将Map转换为List类型 在java中Map接口提供了三种集合获取方式 Key set va
  • VS2015同时将调试信息输出到终端和文件

    下载wtee https github com gvalkov wtee 将wtee exe放到 C Windows System32 目录下 在VS工程的 属性页 gt 配置属性 gt 调试 gt 命令参数一栏的最后面添加 wtee my
  • 请求跨域 CORS policy: No ‘Access-Control-Allow-Origin‘

    目录 1 跨域和同源 2 CORS 跨域资源共享 解决跨域 2 1 前端解决 不推荐 2 2 Nginx 解决跨域 2 3 tomcat 解决跨域 2 4 SpringBoot 服务解决跨域 3 总结 如在浏览器控制台看到类似于下边的报错
  • tomcat下部署jenkins

    tomcat简介 Tomcat是Apache 软件基金会 Apache Software Foundation 的Jakarta 项目中的一个核心项目 由Apache Sun 和其他一些公司及个人共同开发而成 由于有了Sun 的参与和支持
  • 敏捷开发---故事拆解

    很多时候 故事拆解利用模块化处理方式执行 但是跟多事小团队内部协商进行ac处理 体验问题的处理 这种弊端是 缺乏故事完整性 建议 采用全面鱼骨特性 进行小团队作战
  • 理解Python中的with…as…语法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 更详细的参考 http www ibm com developerworks cn opensource os cn pythonwith http blog csdn n
  • padStart()与padEnd()

    padStart padStart 方法 用另一个字符串填充当前字符串 如果需要的话 会重复多次 以便产生的字符串达到给定的长度 从当前字符串的左侧开始填充 语法 str padStart targetLength padString 参数
  • JTS:02 使用WKB操作数据

    版本 org locationtech jts jts core 1 19 0 链接 github 代码 import org locationtech jts geom Coordinate import org locationtech
  • 高德地图通过图层layer实现对海量点的可视化渲染

    一 可视化海量点应用场景 在正文开始之前我先说说我为啥会使用这个技术来实现数据的可视化 事情是这样的 我接手了一个项目 里面有个需求是在地图上标记出他们公司的产品的使用分布 我接手的时候呢 我前面的那位大哥是使用marker点覆盖物 加上f
  • Navigation Preview unavailable in Android Studio 3.4 Preview

    Navigation Preview unavailable in Android Studio 3 4 Preview 最近在学Jetpack Navigation组件 但是在写navigation资源文件的时候 Preview 显示不出
  • 周更计划----web安全学习

    本周做题 ctfshow web入门 信息搜集1 18 目录 web1 web2 web3 web4 web5 web6 web7 web8 web9 web10 web11 web12 web13 web14 web15 web16 we
  • mysql多表查询

    多表关系分类 一对一 任意一方添加外键 关联另外一方的主键 并且设置外键唯一unique 一对多 多对一 在多的一方建立外键 指向一的一方的主键 多对多 将两张表的主键提取出来建立一张中间表 直接查询 会产生无效的笛卡尔积 select f
  • physx选择显卡还是cpu_玩转显卡,再也不用担心被坑

    对于显卡 相信大家都不陌生 无论是玩游戏 还是从事专业的图形设计 有一块好显卡才能如有神助 所以 今天小编就来带大家认识一下显卡本卡 01 什么是显卡 从字面上理解显卡是显示接口卡 显卡英文全称Video card或Graphic card
  • 解决Maven打包报错Could not transfer artifact xxx.xxx找不到依赖的问题

    解决Maven打包报错Could not transfer artifact xxx xxx找不到依赖的问题 概述 方案一 方案二 方案三 作者使用的这种方案 命令事例 概述 当我用idea导入一个新的maven项目 配置好maven仓库
  • 浏览器控制台报错net::ERR_CONNECTION_RESET原因:

    浏览器控制台报错net ERR CONNECTION RESET原因 浏览器控制台报错net ERR CONNECTION RESET原因 浏览器控制台错误 101 net ERR CONNECTION RESET 的本身含义就是这个网站存
  • Web前端开发技术课程大作业,期末考试

    Web前端开发技术课程大作业 期末考试 作业要求 最终界面 部分代码呈现 index html login html index css login css swithpic js 完整代码素材下载 作业要求 网站前端程序不仅要能够把用户要
  • linux下使用sed命令将文件的LF转为CRLF

    linux下使用sed命令将文件的CRLF转为LF 只要将每行中 r变成空就OK 以下命令为将file中的CRLF转为LF sed i s r g file 以下命令为将目录中 c文件和 h文件中的CRLF转为LF find regex c
  • 牛客SQL34: 牛客直播各科目同时在线人数(最大值问题)

    牛客SQL34 牛客直播各科目同时在线人数 最大值问题 内容目录 牛客SQL34 牛客直播各科目同时在线人数 最大值问题 一 描述 二 思路解析 三 代码 四 问题思考 一 描述 牛客某页面推出了数据分析系列直播课程介绍 用户可以选择报名任