LeetCode Database 601 体育馆的人流量

1. 题目描述

X 市建了一个新的体育馆,每日人流量信息被记录在这三列信息中:序号 (id)、日期(date)、 人流量 (people)。

请编写一个查询语句,找出高峰期时段,要求连续三天及以上,并且每天人流量均不少于100。

例如,表 stadium

1
2
3
4
5
6
7
8
9
10
11
12
+------+------------+-----------+
| id | 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-08 | 188 |
+------+------------+-----------+

对于上面的示例数据,输出为:

1
2
3
4
5
6
7
8
+------+------------+-----------+
| id | date | people |
+------+------------+-----------+
| 5 | 2017-01-05 | 145 |
| 6 | 2017-01-06 | 1455 |
| 7 | 2017-01-07 | 199 |
| 8 | 2017-01-08 | 188 |
+------+------------+-----------+

Note:
每天只有一行记录,日期随着 id 的增加而增加。

2. 题解

2.1. MySQL

Note提及:每天只有一行记录,日期随着 id 的增加而增加。所以相邻3天不用必DATEDIFF来判断,直接用3条记录的id值递增1就可以来判断

注意:题目描述有问题,一查测试数据,发现date字段名是visit_date

1
2
3
4
5
6
7
8
SELECT DISTINCT tb1.id, tb1.visit_date, tb1.people  -- 要去重
FROM stadium AS tb1, stadium AS tb2, stadium AS tb3
WHERE tb1.people >= 100 AND tb2.people >= 100 AND tb3.people >= 100 -- 每天人流量均不少于100
-- 3种情况都在考虑,即这一天是3天中的第1天,还是第2天,还是第3天
AND ((tb1.id + 1 = tb2.id AND tb2.id + 1 = tb3.id) OR
(tb2.id + 1 = tb1.id AND tb1.id + 1 = tb3.id) OR
(tb2.id + 1 = tb3.id AND tb3.id + 1 = tb1.id))
ORDER BY tb1.id
panchaoxin wechat
关注我的公众号
支持一下