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

发布时间 2023-03-31 10:06:50作者: 我不想一直当菜鸟

题目:

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