18 Star 92 Fork 52

柯基与佩奇 / 数据库SQL实战

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
66.体育馆的人流量.md 21.61 KB
一键复制 编辑 原始数据 按行查看 历史
王鹏 提交于 2020-09-27 10:42 . 66.体育馆的人流量

体育馆的人流量

题目描述

X 市建了一个新的体育馆,每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、 人流量 (people)。 编写一个查询语句,找出人流量的高峰期。高峰期时,至少连续三行记录中的人流量不少于100。

Create table If Not Exists stadium (id int, visit_date DATE NULL, people int)
Truncate table stadium
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-08', '188')

对于上面的示例数据,输出为: +------+------------+-----------+ | id | visit_date | people | +------+------------+-----------+ | 5 | 2017-01-05 | 145 | | 6 | 2017-01-06 | 1455 | | 7 | 2017-01-07 | 199 | | 8 | 2017-01-08 | 188 | +------+------------+-----------+

提示: 每天只有一行记录,日期随着 id 的增加而增加。 体育馆并不是每天都开放的,所以记录中的日期可能会出现断层。

答案

select distinct t1.*
from stadium t1, stadium t2, stadium t3
where t1.people >= 100 and t2.people >= 100 and t3.people >= 100
and
(
	  (t1.id - t2.id = 1 and t1.id - t3.id = 2 and t2.id - t3.id =1)  -- t1, t2, t3
    or
    (t2.id - t1.id = 1 and t2.id - t3.id = 2 and t1.id - t3.id =1) -- t2, t1, t3
    or
    (t3.id - t2.id = 1 and t2.id - t1.id =1 and t3.id - t1.id = 2) -- t3, t2, t1
)
order by t1.id;

题解

使用 JOIN 和 WHERE 子句【通过】 思路

在表 stadium 中查询人流量超过 100 的记录,将查询结果与其自身的临时表连接,再使用 WHERE 子句获得满足条件的记录。

算法

第一步:查询人流量超过 100 的记录,然后将结果与其自身的临时表连接。

MySQL

select distinct t1.* from stadium t1, stadium t2, stadium t3 where t1.people >= 100 and t2.people >= 100 and t3.people >= 100;

id date people id date people id date people
2 2017-01-02 109 2 2017-01-02 109 2 2017-01-02 109
3 2017-01-03 150 2 2017-01-02 109 2 2017-01-02 109
5 2017-01-05 145 2 2017-01-02 109 2 2017-01-02 109
6 2017-01-06 1455 2 2017-01-02 109 2 2017-01-02 109
7 2017-01-07 199 2 2017-01-02 109 2 2017-01-02 109
8 2017-01-08 188 2 2017-01-02 109 2 2017-01-02 109
2 2017-01-02 109 3 2017-01-03 150 2 2017-01-02 109
3 2017-01-03 150 3 2017-01-03 150 2 2017-01-02 109
5 2017-01-05 145 3 2017-01-03 150 2 2017-01-02 109
6 2017-01-06 1455 3 2017-01-03 150 2 2017-01-02 109
7 2017-01-07 199 3 2017-01-03 150 2 2017-01-02 109
8 2017-01-08 188 3 2017-01-03 150 2 2017-01-02 109
2 2017-01-02 109 5 2017-01-05 145 2 2017-01-02 109
3 2017-01-03 150 5 2017-01-05 145 2 2017-01-02 109
5 2017-01-05 145 5 2017-01-05 145 2 2017-01-02 109
6 2017-01-06 1455 5 2017-01-05 145 2 2017-01-02 109
7 2017-01-07 199 5 2017-01-05 145 2 2017-01-02 109
8 2017-01-08 188 5 2017-01-05 145 2 2017-01-02 109
2 2017-01-02 109 6 2017-01-06 1455 2 2017-01-02 109
3 2017-01-03 150 6 2017-01-06 1455 2 2017-01-02 109
5 2017-01-05 145 6 2017-01-06 1455 2 2017-01-02 109
6 2017-01-06 1455 6 2017-01-06 1455 2 2017-01-02 109
7 2017-01-07 199 6 2017-01-06 1455 2 2017-01-02 109
8 2017-01-08 188 6 2017-01-06 1455 2 2017-01-02 109
2 2017-01-02 109 7 2017-01-07 199 2 2017-01-02 109
3 2017-01-03 150 7 2017-01-07 199 2 2017-01-02 109
5 2017-01-05 145 7 2017-01-07 199 2 2017-01-02 109
6 2017-01-06 1455 7 2017-01-07 199 2 2017-01-02 109
7 2017-01-07 199 7 2017-01-07 199 2 2017-01-02 109
8 2017-01-08 188 7 2017-01-07 199 2 2017-01-02 109
2 2017-01-02 109 8 2017-01-08 188 2 2017-01-02 109
3 2017-01-03 150 8 2017-01-08 188 2 2017-01-02 109
5 2017-01-05 145 8 2017-01-08 188 2 2017-01-02 109
6 2017-01-06 1455 8 2017-01-08 188 2 2017-01-02 109
7 2017-01-07 199 8 2017-01-08 188 2 2017-01-02 109
8 2017-01-08 188 8 2017-01-08 188 2 2017-01-02 109
2 2017-01-02 109 2 2017-01-02 109 3 2017-01-03 150
3 2017-01-03 150 2 2017-01-02 109 3 2017-01-03 150
5 2017-01-05 145 2 2017-01-02 109 3 2017-01-03 150
6 2017-01-06 1455 2 2017-01-02 109 3 2017-01-03 150
7 2017-01-07 199 2 2017-01-02 109 3 2017-01-03 150
8 2017-01-08 188 2 2017-01-02 109 3 2017-01-03 150
2 2017-01-02 109 3 2017-01-03 150 3 2017-01-03 150
3 2017-01-03 150 3 2017-01-03 150 3 2017-01-03 150
5 2017-01-05 145 3 2017-01-03 150 3 2017-01-03 150
6 2017-01-06 1455 3 2017-01-03 150 3 2017-01-03 150
7 2017-01-07 199 3 2017-01-03 150 3 2017-01-03 150
8 2017-01-08 188 3 2017-01-03 150 3 2017-01-03 150
2 2017-01-02 109 5 2017-01-05 145 3 2017-01-03 150
3 2017-01-03 150 5 2017-01-05 145 3 2017-01-03 150
5 2017-01-05 145 5 2017-01-05 145 3 2017-01-03 150
6 2017-01-06 1455 5 2017-01-05 145 3 2017-01-03 150
7 2017-01-07 199 5 2017-01-05 145 3 2017-01-03 150
8 2017-01-08 188 5 2017-01-05 145 3 2017-01-03 150
2 2017-01-02 109 6 2017-01-06 1455 3 2017-01-03 150
3 2017-01-03 150 6 2017-01-06 1455 3 2017-01-03 150
5 2017-01-05 145 6 2017-01-06 1455 3 2017-01-03 150
6 2017-01-06 1455 6 2017-01-06 1455 3 2017-01-03 150
7 2017-01-07 199 6 2017-01-06 1455 3 2017-01-03 150
8 2017-01-08 188 6 2017-01-06 1455 3 2017-01-03 150
2 2017-01-02 109 7 2017-01-07 199 3 2017-01-03 150
3 2017-01-03 150 7 2017-01-07 199 3 2017-01-03 150
5 2017-01-05 145 7 2017-01-07 199 3 2017-01-03 150
6 2017-01-06 1455 7 2017-01-07 199 3 2017-01-03 150
7 2017-01-07 199 7 2017-01-07 199 3 2017-01-03 150
8 2017-01-08 188 7 2017-01-07 199 3 2017-01-03 150
2 2017-01-02 109 8 2017-01-08 188 3 2017-01-03 150
3 2017-01-03 150 8 2017-01-08 188 3 2017-01-03 150
5 2017-01-05 145 8 2017-01-08 188 3 2017-01-03 150
6 2017-01-06 1455 8 2017-01-08 188 3 2017-01-03 150
7 2017-01-07 199 8 2017-01-08 188 3 2017-01-03 150
8 2017-01-08 188 8 2017-01-08 188 3 2017-01-03 150
2 2017-01-02 109 2 2017-01-02 109 5 2017-01-05 145
3 2017-01-03 150 2 2017-01-02 109 5 2017-01-05 145
5 2017-01-05 145 2 2017-01-02 109 5 2017-01-05 145
6 2017-01-06 1455 2 2017-01-02 109 5 2017-01-05 145
7 2017-01-07 199 2 2017-01-02 109 5 2017-01-05 145
8 2017-01-08 188 2 2017-01-02 109 5 2017-01-05 145
2 2017-01-02 109 3 2017-01-03 150 5 2017-01-05 145
3 2017-01-03 150 3 2017-01-03 150 5 2017-01-05 145
5 2017-01-05 145 3 2017-01-03 150 5 2017-01-05 145
6 2017-01-06 1455 3 2017-01-03 150 5 2017-01-05 145
7 2017-01-07 199 3 2017-01-03 150 5 2017-01-05 145
8 2017-01-08 188 3 2017-01-03 150 5 2017-01-05 145
2 2017-01-02 109 5 2017-01-05 145 5 2017-01-05 145
3 2017-01-03 150 5 2017-01-05 145 5 2017-01-05 145
5 2017-01-05 145 5 2017-01-05 145 5 2017-01-05 145
6 2017-01-06 1455 5 2017-01-05 145 5 2017-01-05 145
7 2017-01-07 199 5 2017-01-05 145 5 2017-01-05 145
8 2017-01-08 188 5 2017-01-05 145 5 2017-01-05 145
2 2017-01-02 109 6 2017-01-06 1455 5 2017-01-05 145
3 2017-01-03 150 6 2017-01-06 1455 5 2017-01-05 145
5 2017-01-05 145 6 2017-01-06 1455 5 2017-01-05 145
6 2017-01-06 1455 6 2017-01-06 1455 5 2017-01-05 145
7 2017-01-07 199 6 2017-01-06 1455 5 2017-01-05 145
8 2017-01-08 188 6 2017-01-06 1455 5 2017-01-05 145
2 2017-01-02 109 7 2017-01-07 199 5 2017-01-05 145
3 2017-01-03 150 7 2017-01-07 199 5 2017-01-05 145
5 2017-01-05 145 7 2017-01-07 199 5 2017-01-05 145
6 2017-01-06 1455 7 2017-01-07 199 5 2017-01-05 145
7 2017-01-07 199 7 2017-01-07 199 5 2017-01-05 145
8 2017-01-08 188 7 2017-01-07 199 5 2017-01-05 145
2 2017-01-02 109 8 2017-01-08 188 5 2017-01-05 145
3 2017-01-03 150 8 2017-01-08 188 5 2017-01-05 145
5 2017-01-05 145 8 2017-01-08 188 5 2017-01-05 145
6 2017-01-06 1455 8 2017-01-08 188 5 2017-01-05 145
7 2017-01-07 199 8 2017-01-08 188 5 2017-01-05 145
8 2017-01-08 188 8 2017-01-08 188 5 2017-01-05 145
2 2017-01-02 109 2 2017-01-02 109 6 2017-01-06 1455
3 2017-01-03 150 2 2017-01-02 109 6 2017-01-06 1455
5 2017-01-05 145 2 2017-01-02 109 6 2017-01-06 1455
6 2017-01-06 1455 2 2017-01-02 109 6 2017-01-06 1455
7 2017-01-07 199 2 2017-01-02 109 6 2017-01-06 1455
8 2017-01-08 188 2 2017-01-02 109 6 2017-01-06 1455
2 2017-01-02 109 3 2017-01-03 150 6 2017-01-06 1455
3 2017-01-03 150 3 2017-01-03 150 6 2017-01-06 1455
5 2017-01-05 145 3 2017-01-03 150 6 2017-01-06 1455
6 2017-01-06 1455 3 2017-01-03 150 6 2017-01-06 1455
7 2017-01-07 199 3 2017-01-03 150 6 2017-01-06 1455
8 2017-01-08 188 3 2017-01-03 150 6 2017-01-06 1455
2 2017-01-02 109 5 2017-01-05 145 6 2017-01-06 1455
3 2017-01-03 150 5 2017-01-05 145 6 2017-01-06 1455
5 2017-01-05 145 5 2017-01-05 145 6 2017-01-06 1455
6 2017-01-06 1455 5 2017-01-05 145 6 2017-01-06 1455
7 2017-01-07 199 5 2017-01-05 145 6 2017-01-06 1455
8 2017-01-08 188 5 2017-01-05 145 6 2017-01-06 1455
2 2017-01-02 109 6 2017-01-06 1455 6 2017-01-06 1455
3 2017-01-03 150 6 2017-01-06 1455 6 2017-01-06 1455
5 2017-01-05 145 6 2017-01-06 1455 6 2017-01-06 1455
6 2017-01-06 1455 6 2017-01-06 1455 6 2017-01-06 1455
7 2017-01-07 199 6 2017-01-06 1455 6 2017-01-06 1455
8 2017-01-08 188 6 2017-01-06 1455 6 2017-01-06 1455
2 2017-01-02 109 7 2017-01-07 199 6 2017-01-06 1455
3 2017-01-03 150 7 2017-01-07 199 6 2017-01-06 1455
5 2017-01-05 145 7 2017-01-07 199 6 2017-01-06 1455
6 2017-01-06 1455 7 2017-01-07 199 6 2017-01-06 1455
7 2017-01-07 199 7 2017-01-07 199 6 2017-01-06 1455
8 2017-01-08 188 7 2017-01-07 199 6 2017-01-06 1455
2 2017-01-02 109 8 2017-01-08 188 6 2017-01-06 1455
3 2017-01-03 150 8 2017-01-08 188 6 2017-01-06 1455
5 2017-01-05 145 8 2017-01-08 188 6 2017-01-06 1455
6 2017-01-06 1455 8 2017-01-08 188 6 2017-01-06 1455
7 2017-01-07 199 8 2017-01-08 188 6 2017-01-06 1455
8 2017-01-08 188 8 2017-01-08 188 6 2017-01-06 1455
2 2017-01-02 109 2 2017-01-02 109 7 2017-01-07 199
3 2017-01-03 150 2 2017-01-02 109 7 2017-01-07 199
5 2017-01-05 145 2 2017-01-02 109 7 2017-01-07 199
6 2017-01-06 1455 2 2017-01-02 109 7 2017-01-07 199
7 2017-01-07 199 2 2017-01-02 109 7 2017-01-07 199
8 2017-01-08 188 2 2017-01-02 109 7 2017-01-07 199
2 2017-01-02 109 3 2017-01-03 150 7 2017-01-07 199
3 2017-01-03 150 3 2017-01-03 150 7 2017-01-07 199
5 2017-01-05 145 3 2017-01-03 150 7 2017-01-07 199
6 2017-01-06 1455 3 2017-01-03 150 7 2017-01-07 199
7 2017-01-07 199 3 2017-01-03 150 7 2017-01-07 199
8 2017-01-08 188 3 2017-01-03 150 7 2017-01-07 199
2 2017-01-02 109 5 2017-01-05 145 7 2017-01-07 199
3 2017-01-03 150 5 2017-01-05 145 7 2017-01-07 199
5 2017-01-05 145 5 2017-01-05 145 7 2017-01-07 199
6 2017-01-06 1455 5 2017-01-05 145 7 2017-01-07 199
7 2017-01-07 199 5 2017-01-05 145 7 2017-01-07 199
8 2017-01-08 188 5 2017-01-05 145 7 2017-01-07 199
2 2017-01-02 109 6 2017-01-06 1455 7 2017-01-07 199
3 2017-01-03 150 6 2017-01-06 1455 7 2017-01-07 199
5 2017-01-05 145 6 2017-01-06 1455 7 2017-01-07 199
6 2017-01-06 1455 6 2017-01-06 1455 7 2017-01-07 199
7 2017-01-07 199 6 2017-01-06 1455 7 2017-01-07 199
8 2017-01-08 188 6 2017-01-06 1455 7 2017-01-07 199
2 2017-01-02 109 7 2017-01-07 199 7 2017-01-07 199
3 2017-01-03 150 7 2017-01-07 199 7 2017-01-07 199
5 2017-01-05 145 7 2017-01-07 199 7 2017-01-07 199
6 2017-01-06 1455 7 2017-01-07 199 7 2017-01-07 199
7 2017-01-07 199 7 2017-01-07 199 7 2017-01-07 199
8 2017-01-08 188 7 2017-01-07 199 7 2017-01-07 199
2 2017-01-02 109 8 2017-01-08 188 7 2017-01-07 199
3 2017-01-03 150 8 2017-01-08 188 7 2017-01-07 199
5 2017-01-05 145 8 2017-01-08 188 7 2017-01-07 199
6 2017-01-06 1455 8 2017-01-08 188 7 2017-01-07 199
7 2017-01-07 199 8 2017-01-08 188 7 2017-01-07 199
8 2017-01-08 188 8 2017-01-08 188 7 2017-01-07 199
2 2017-01-02 109 2 2017-01-02 109 8 2017-01-08 188
3 2017-01-03 150 2 2017-01-02 109 8 2017-01-08 188
5 2017-01-05 145 2 2017-01-02 109 8 2017-01-08 188
6 2017-01-06 1455 2 2017-01-02 109 8 2017-01-08 188
7 2017-01-07 199 2 2017-01-02 109 8 2017-01-08 188
8 2017-01-08 188 2 2017-01-02 109 8 2017-01-08 188
2 2017-01-02 109 3 2017-01-03 150 8 2017-01-08 188
3 2017-01-03 150 3 2017-01-03 150 8 2017-01-08 188
5 2017-01-05 145 3 2017-01-03 150 8 2017-01-08 188
6 2017-01-06 1455 3 2017-01-03 150 8 2017-01-08 188
7 2017-01-07 199 3 2017-01-03 150 8 2017-01-08 188
8 2017-01-08 188 3 2017-01-03 150 8 2017-01-08 188
2 2017-01-02 109 5 2017-01-05 145 8 2017-01-08 188
3 2017-01-03 150 5 2017-01-05 145 8 2017-01-08 188
5 2017-01-05 145 5 2017-01-05 145 8 2017-01-08 188
6 2017-01-06 1455 5 2017-01-05 145 8 2017-01-08 188
7 2017-01-07 199 5 2017-01-05 145 8 2017-01-08 188
8 2017-01-08 188 5 2017-01-05 145 8 2017-01-08 188
2 2017-01-02 109 6 2017-01-06 1455 8 2017-01-08 188
3 2017-01-03 150 6 2017-01-06 1455 8 2017-01-08 188
5 2017-01-05 145 6 2017-01-06 1455 8 2017-01-08 188
6 2017-01-06 1455 6 2017-01-06 1455 8 2017-01-08 188
7 2017-01-07 199 6 2017-01-06 1455 8 2017-01-08 188
8 2017-01-08 188 6 2017-01-06 1455 8 2017-01-08 188
2 2017-01-02 109 7 2017-01-07 199 8 2017-01-08 188
3 2017-01-03 150 7 2017-01-07 199 8 2017-01-08 188
5 2017-01-05 145 7 2017-01-07 199 8 2017-01-08 188
6 2017-01-06 1455 7 2017-01-07 199 8 2017-01-08 188
7 2017-01-07 199 7 2017-01-07 199 8 2017-01-08 188
8 2017-01-08 188 7 2017-01-07 199 8 2017-01-08 188
2 2017-01-02 109 8 2017-01-08 188 8 2017-01-08 188
3 2017-01-03 150 8 2017-01-08 188 8 2017-01-08 188
5 2017-01-05 145 8 2017-01-08 188 8 2017-01-08 188
6 2017-01-06 1455 8 2017-01-08 188 8 2017-01-08 188
7 2017-01-07 199 8 2017-01-08 188 8 2017-01-08 188
8 2017-01-08 188 8 2017-01-08 188 8 2017-01-08 188
共有 6 天人流量超过 100 人,笛卡尔积 后有 216(666) 条记录。
前 3 列来自表 t1,中间 3 列来自表 t2,最后 3 列来自表 t3。
表 t1,t2 和 t3 相同,需要考虑添加哪些条件能够得到想要的结果。以 t1 为例,它有可能是高峰期的第 1 天,第 2 天,或第 3 天。

t1 是高峰期第 1 天:(t1.id - t2.id = 1 and t1.id - t3.id = 2 and t2.id - t3.id =1) -- t1, t2, t3 t1 是高峰期第 2 天:(t2.id - t1.id = 1 and t2.id - t3.id = 2 and t1.id - t3.id =1) -- t2, t1, t3 t1 是高峰期第 3 天:(t3.id - t2.id = 1 and t2.id - t1.id =1 and t3.id - t1.id = 2) -- t3, t2, t1 MySQL

select t1.* from stadium t1, stadium t2, stadium t3 where t1.people >= 100 and t2.people >= 100 and t3.people >= 100 and ( (t1.id - t2.id = 1 and t1.id - t3.id = 2 and t2.id - t3.id =1) -- t1, t2, t3 or (t2.id - t1.id = 1 and t2.id - t3.id = 2 and t1.id - t3.id =1) -- t2, t1, t3 or (t3.id - t2.id = 1 and t2.id - t1.id =1 and t3.id - t1.id = 2) -- t3, t2, t1 ) ;

id date people
7 2017-01-07 199
6 2017-01-06 1455
8 2017-01-08 188
7 2017-01-07 199
5 2017-01-05 145
6 2017-01-06 1455
可以看到查询结果中存在重复的记录,再使用 DISTINCT 去重。
SQL
1
https://gitee.com/wp950820/database-sql-combat.git
git@gitee.com:wp950820/database-sql-combat.git
wp950820
database-sql-combat
数据库SQL实战
master

搜索帮助