随笔 - 384  文章 - 0  评论 - 0  阅读 - 13万

力扣601(MySQL)-体育馆的人的流量(困难)

题目:

表:Stadium

编写一个 SQL 查询以找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。

返回按 visit_date 升序排列 的结果表。

查询结果格式如下所示

示例1:

  

解释:
id 为 5、6、7、8 的四行 id 连续,并且每行都有 >= 100 的人数记录。
请注意,即使第 7 行和第 8 行的 visit_date 不是连续的,输出也应当包含第 8 行,因为我们只需要考虑 id 连续的记录。
不输出 id 为 2 和 3 的行,因为至少需要三条 id 连续的记录。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/human-traffic-of-stadium
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

通用解法:连续N天,只要是连续的,都可以用等差的思想; 即(用某个连续字段 - 行号/排行 ),若是连续的,差值一定相同,再统计相同差值的个数即可。

①先筛选出people >= 100的数据,再给筛选后的数据以id进行连续排序,然后计算id与排序号的差值;

1 SELECT id,visit_date,people,id - (dense_rank() over(order by id)) as diff_num
2 FROM stadium_601
3 WHERE people >= 100;

 ②再以第一步查询到的diff_num分组,统计差值相同的个数;

1 SELECT a.id,a.visit_date,a.people,count( a.id ) over ( PARTITION BY a.diff_num ) AS cout 
2 FROM (
3         SELECT id,visit_date,people,id - (dense_rank() over(order by id)) AS diff_num
4         FROM stadium_601
5         WHERE people >= 100
6  )AS a 

③根据上一步的查询结果,筛选出cout >= 3的数据,再按visit_date升序排列输出即可。

复制代码
 1 select id, visit_date, people
 2 from (
 3     select id,visit_date,people,count(id) over (partition by diff_num) as cout
 4     from(
 5        select id,visit_date,people,id - (dense_rank() over (order by id) ) as diff_num
 6        from Stadium
 7        WHERE people >= 100
 8        ) as a
 9     ) as b
10 where b.cout >= 3
11 order by visit_date;
复制代码

posted on   我不想一直当菜鸟  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示