最近在刷leetcode题库,刚好看到中文网站已经上线了,新增了ms sql解释器。困难难度链接在这,就顺便吐槽一下这个中文名字吧。 [ 力扣题库 ]
601. 体育馆的人流量
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 的增加而增加。
解法
select * from
(
select a.* from stadium a
join stadium b on a.id=b.id+1
join stadium c on a.id=c.id+2
where a.people >= 100 and b.people>= 100 and c.people >= 100
union
select b.* from stadium a
join stadium b on a.id=b.id+1
join stadium c on a.id=c.id+2
where a.people >= 100 and b.people>= 100 and c.people >= 100
union
select c.* from stadium a
join stadium b on a.id=b.id+1
join stadium c on a.id=c.id+2
where a.people >= 100 and b.people>= 100 and c.people >= 100
) a
order by id
解题思路
- 首先自关联三次,得到符合条件的两条数据。
select * from stadium a
join stadium b on a.id=b.id+1
join stadium c on a.id=c.id+2
where a.people >= 100 and b.people>= 100 and c.people >= 100
结果表:
id | date | people | id | date | people | id | date | people |
---|---|---|---|---|---|---|---|---|
7 | 2017-01-07 | 199 | 6 | 2017-01-06 | 1455 | 5 | 2017-01-05 | 145 |
8 | 2017-01-08 | 188 | 7 | 2017-01-07 | 199 | 6 | 2017-01-06 | 1455 |
结果是横向的,转换一下就是:
id | date | people |
---|---|---|
5 | 2017-01-05 | 145 |
6 | 2017-01-06 | 1455 |
7 | 2017-01-07 | 199 |
和
id | date | people |
---|---|---|
6 | 2017-01-06 | 1455 |
7 | 2017-01-07 | 199 |
8 | 2017-01-08 | 188 |
- 最终需要的结果是全部合并,所以用union就ok了。
*如有问题,敬请留言。