LeetCode题库 数据库分类 困难 601. 体育馆的人流量 MS SQL解法 答案

最近在刷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了。


*如有问题,敬请留言。

猜你喜欢

转载自blog.csdn.net/wwivywwivy/article/details/80439187