牛客SQL163

 

 

 

思路:

  1. 题目要求我们统计每篇文章的同一时刻最大在线人数,所以我们观察表结构,通过进入时间和离开时间我们知道一个用户什么时候在线,什么时候不在线
  2. 也就是说一个int time代表在线人数+1,一个out time代表在线人数-1,所以我们需要在时间戳后面加一个伪列
  3. 但此时的表结构显然是不符合我们的需求的,所以我们第一步需要拆表,加伪列,然后拼接,于是我们就得到了下面的结果

 

 

 

里面有一些小细节,比如

题目需求只需要每篇文章和人数,所以为了减少不必要的数据只需要三个字段

然后与之前不同的是,在拼接之前就使用了where语句,理由谓词下推,过滤条件与源数据靠拢

注意union  union all的区别,这里需要重复数据,因为可能出现同一时间出现相同的操作

得到数据如下

 

 

 

  1. 于是我们就可以清楚的知道什么时间用户数+1或者-1,也就是说

第二步,我们根据时间排序,通过sum求和开窗就能知道每一时刻的在线人数

代码如下

 

 

 

其中,题目要求

 

 

 

所以根据时间排序是,还要根据增加数排序

结果如下

 

 

 

那么开窗求和之后数据为什么会变成这样呢

因为

 

 

 

 

 

 

也就是说他会根据时间顺序默认从第一行加到当前行

  1. 观察数据很明了,最终我们只需要通过分组,max找到最大的人数即可,别忘了题目要求根据人数降序

结果如下

 

 

 

 

 

本文档来源:yyc

 

 

总结下来这题思路就是拆表,合表,开窗排序求和取最大值

posted @   飞翔的小鸟er  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示