题目描述

(通过次数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 为 5678 的四行 id 连续,并且每行都有 >= 100 的人数记录。
请注意,即使第 7 行和第 8 行的 visit_date 不是连续的,输出也应当包含第 8 行,因为我们只需要考虑 id 连续的记录。
不输出 id 为 23 的行,因为至少需要三条 id 连续的记录。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/human-traffic-of-stadium
表: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
表: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');
//测试数据 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');
//测试数据
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;
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;
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