教日月换新天。为有牺牲多壮志,敢

[SQL]LeetCode601. 体育馆的人流量 | Human Traffic of Stadium

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10451553.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

SQL架构

复制代码
 1 Create table If Not Exists stadium (id int, visit_date DATE NULL, people int)
 2 Truncate table stadium
 3 insert into stadium (id, visit_date, people) values ('1', '2017-01-01', '10')
 4 insert into stadium (id, visit_date, people) values ('2', '2017-01-02', '109')
 5 insert into stadium (id, visit_date, people) values ('3', '2017-01-03', '150')
 6 insert into stadium (id, visit_date, people) values ('4', '2017-01-04', '99')
 7 insert into stadium (id, visit_date, people) values ('5', '2017-01-05', '145')
 8 insert into stadium (id, visit_date, people) values ('6', '2017-01-06', '1455')
 9 insert into stadium (id, visit_date, people) values ('7', '2017-01-07', '199')
10 insert into stadium (id, visit_date, people) values ('8', '2017-01-08', '188')
复制代码

X city built a new stadium, each day many people visit it and the stats are saved as these columns: id, visit_date, people

Please write a query to display the records which have 3 or more consecutive rows and the amount of people more than 100(inclusive).

For example, the table 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-08 | 188       |
+------+------------+-----------+

For the sample data above, the output is:

+------+------------+-----------+
| id   | visit_date | people    |
+------+------------+-----------+
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-08 | 188       |
+------+------------+-----------+

Note:
Each day only have one row record, and the dates are increasing with id increasing.


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

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

例如,表 stadium

+------+------------+-----------+
| 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       |
+------+------------+-----------+

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

+------+------------+-----------+
| 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 的增加而增加。


260ms

复制代码
 1 # Write your MySQL query statement below
 2 select distinct t1.*
 3 from stadium t1, stadium t2, stadium t3
 4 where t1.people>=100 and t2.people>=100 and t3.people>=100
 5 and
 6 ((t1.id-t2.id=1 and t1.id-t3.id=2 and t2.id-t3.id=1)
 7 or
 8 (t2.id-t1.id=1 and t2.id-t3.id=2 and t1.id-t3.id=1)
 9 or
10 (t3.id-t2.id=1 and t2.id-t1.id=1 and t3.id-t1.id=2))
11 order by t1.id
复制代码

266ms

复制代码
 1 # Write your MySQL query statement below
 2 
 3 select distinct t.* from 
 4 stadium t ,
 5 (
 6 select 
 7 t1.Id, t2.Id as t2Id, t3.Id as t3Id
 8 from (
 9 select * from stadium 
10 where people>=100)  as t1
11 left join
12 (
13 select * from stadium 
14 where people>=100 ) as t2
15 ON  t1.Id+1=t2.Id
16 left join 
17 (
18 select * from stadium 
19 where people>=100 ) as t3
20 ON  t1.Id+2=t3.Id
21 where (t2.Id is not null and t3.Id is not null)
22 ) as b 
23 where (t.Id=b.Id or t.Id=b.t2Id or t.Id=b.t3Id);
复制代码

268ms

复制代码
 1 # Write your MySQL query statement below
 2 SELECT s1.id AS id
 3       ,s1.date AS date
 4       ,s1.people AS people
 5 FROM stadium s1, stadium s2, stadium s3
 6 WHERE(
 7     (s1.id = s2.id - 1 AND s1.id = s3.id - 2)
 8     OR (s1.id = s2.id + 1 AND s1.id = s3.id - 1)
 9     OR (s1.id = s2.id + 1 AND s1.id = s3.id +2)
10     )
11 AND s1.people >= 100
12 AND s2.people >= 100
13 AND s3.people >= 100
14 GROUP BY s1.id;
复制代码

 

posted @   为敢技术  阅读(497)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示
哥伦布
09:09发布
哥伦布
09:09发布
3°
多云
东南风
3级
空气质量
相对湿度
47%
今天
中雨
3°/15°
周三
中雨
3°/13°
周四
小雪
-1°/6°