题目:
表: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;标签:601,people,visit,力扣,num,MySQL,date,100,id From: https://www.cnblogs.com/liu-myu/p/17275334.html