牛客SQL163
思路:
- 题目要求我们统计每篇文章的同一时刻最大在线人数,所以我们观察表结构,通过进入时间和离开时间我们知道一个用户什么时候在线,什么时候不在线
- 也就是说一个int time代表在线人数+1,一个out time代表在线人数-1,所以我们需要在时间戳后面加一个伪列
- 但此时的表结构显然是不符合我们的需求的,所以我们第一步需要拆表,加伪列,然后拼接表,于是我们就得到了下面的结果
里面有一些小细节,比如
题目需求只需要每篇文章和人数,所以为了减少不必要的数据只需要三个字段
然后与之前不同的是,在拼接之前就使用了where语句,理由谓词下推,过滤条件与源数据靠拢
注意union 与 union all的区别,这里需要重复数据,因为可能出现同一时间出现相同的操作
得到数据如下
- 于是我们就可以清楚的知道什么时间用户数+1或者-1,也就是说
第二步,我们根据时间排序,通过sum求和开窗就能知道每一时刻的在线人数
代码如下
其中,题目要求
所以根据时间排序是,还要根据增加数排序
结果如下
那么开窗求和之后数据为什么会变成这样呢
因为
也就是说他会根据时间顺序默认从第一行加到当前行
- 观察数据很明了,最终我们只需要通过分组,max找到最大的人数即可,别忘了题目要求根据人数降序
结果如下
本文档来源:yyc
总结下来这题思路就是拆表,合表,开窗排序求和取最大值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?