游泳館的人流量SQl
無迪卡爾積,無高階函數。思路清晰
X 市建了一個新的體育館,每日人流量信息被記錄在這三列信息中:序號 (id)、日期 (visit_date)、 人流量 (people)。
請編寫一個查詢語句,找出人流量的高峯期。高峯期時,至少連續三行記錄中的人流量不少於100。
例如,表 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 |
±-----±-----------±----------+
對於上面的示例數據,輸出爲:
±-----±-----------±----------+
| 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 的增加而增加。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/human-traffic-of-stadium
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
https://leetcode-cn.com/problems/human-traffic-of-stadium/solution/qiu-ba-ba-men-zhao-cuo-wu-di-qia-er-ji-wu-gao-jie-/
解題思路
- 第一步、一個id關聯 自身及附近的id (如T1.id=2 則T2.id = 1、2、3 共三條記錄 均滿足關聯條件)
- 第二步、過濾掉100以下的id,然後統計該id關聯出來的數據條數,如果數量等於三,則代表 1、2、3一定均大於100。
- 第三步、利用查詢出的ID 回關聯原表 並去重(第三步需要注意 如果id=2符合條件,則代表id=1、id=3也符合條件)
作者:zha-yan
鏈接:https://leetcode-cn.com/problems/human-traffic-of-stadium/solution/qiu-ba-ba-men-zhao-cuo-wu-di-qia-er-ji-wu-gao-jie-/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
SELECT DISTINCT TT.* FROM stadium TT
INNER JOIN (
SELECT T1.id,COUNT(*) FROM stadium T1
INNER JOIN stadium T2
ON( T1.id=T2.id
OR T1.id=T2.id+1
OR T1.id=t2.id-1
)
WHERE T2.people>100
GROUP BY T1.id
HAVING COUNT(*)>=3
) TID
ON TT.id=TID.id
OR TT.id+1=TID.id
OR TT.id-1=TID.id