题目描述

(通过次数43,589 | 提交次数91,482,通过率47.63%)

表:Stadium
+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| visit_date    | date    |
| people        | int     |
+---------------+---------+
visit_date 是表的主键
每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、人流量 (people)
每天只有一行记录,日期随着 id 的增加而增加

编写一个 SQL 查询以找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。
返回按 visit_date 升序排列 的结果表。
查询结果格式如下所示。

示例 1:
输入:
Stadium 表:
+------+------------+-----------+
| id   | visit_date | people    |
+------+------------+-----------+
| 1    | 2017-01-01 | 10        |
| 2    | 2017-01-02 | 109       |
| 3    | 2017-01-03 | 150       |
| 4    | 2017-01-04 | 99        |
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-09 | 188       |
+------+------------+-----------+
输出:
+------+------------+-----------+
| id   | visit_date | people    |
+------+------------+-----------+
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-09 | 188       |
+------+------------+-----------+
解释:
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
//测试数据
Create table If Not Exists Stadium (id int, visit_date DATE NULL, people int);

insert into Stadium (id, visit_date, people) values ('1', '2017-01-01', '10');
insert into Stadium (id, visit_date, people) values ('2', '2017-01-02', '109');
insert into Stadium (id, visit_date, people) values ('3', '2017-01-03', '150');
insert into Stadium (id, visit_date, people) values ('4', '2017-01-04', '99');
insert into Stadium (id, visit_date, people) values ('5', '2017-01-05', '145');
insert into Stadium (id, visit_date, people) values ('6', '2017-01-06', '1455');
insert into Stadium (id, visit_date, people) values ('7', '2017-01-07', '199');
insert into Stadium (id, visit_date, people) values ('8', '2017-01-09', '188');

解题思路

题目要求取连续N天人流量都在100以上的天。

根据题目的描述,很明显,这是一道求连接区间的问题。

但跟之前的连续区间问题还是有些区别:

第一点:这里的连续条件,指的是当日人流量在100以上;

第二点:结果要求返回的不是连续区间的起止日期,而是具体的日期明细;

不过,不管怎么说,这仍然是一道求连续区间的问题。

关于连接区间的特点,在《单挑力扣(LeetCode)SQL题:1285. 找到连续区间的开始和结束数字(难度:中等)》的推文中有详细说过。

这里就不再细说了。小伙伴们可以通过上面的链接穿越过去了解一下。

下面的参考SQL,使用连续区间的第三个特性实现。

参考SQL

未特别说明的情况下,参考SQL为基于MySQL8.0实现。
with
tmp as (
    select
        id,
        visit_date,
        people,
        row_number() over(order by id) rn
    from Stadium
    where people >= 100
)
select
    id,
    visit_date,
    people
from tmp
where id-rn in (
    select id-rn
    from tmp
    group by id-rn
    having count(*)>=3
)
order by visit_date;
picture loss