本文最后更新于298 天前,其中的信息可能已经过时,如有错误请发送邮件到2446865563@qq.com
1.题目基本信息
1.1.题目描述
表:Stadium
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| visit_date | date |
| people | int |
+---------------+---------+
visit_date 是该表中具有唯一值的列。
每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、 人流量 (people)
每天只有一行记录,日期随着 id 的增加而增加
编写解决方案找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。
返回按 visit_date 升序排列 的结果表。
1.2.题目地址
https://leetcode.cn/problems/human-traffic-of-stadium/description/
2.解题方法
2.1.解题思路
先将people>=100的记录标记为0,其余的标记为1,使用flag字段记录,然后使用窗口函数统计flag的和,记为flag_sum字段,然后根据flag_sum字段窗口聚合
2.2.解题步骤
第一步,将people>=100的记录标记为0,其余的标记为1,使用flag字段记录;然后使用窗口函数统计flag的和,记为flag_sum字段,得到表格T1
第二步,筛选出people>=100的记录,并在这个表格的基础上,使用窗口函数统计flag_sum对应的各个记录的个数,记为cnt字段,得到表格T2
第三步,在T2的基础上,筛选出cnt>=3的记录,并使用visit_date进行升序排列,即得到题解
3.解题代码
sql代码
# Write your MySQL query statement below
# 思路:先将people>=100的记录标记为0,其余的标记为1,使用flag字段记录,然后使用窗口函数统计flag的和,记为flag_sum字段,然后根据flag_sum字段窗口聚合
with T1 AS (
# 第一步,将people>=100的记录标记为0,其余的标记为1,使用flag字段记录;然后使用窗口函数统计flag的和,记为flag_sum字段,得到表格T1
SELECT
*,
SUM(IF(people >= 100, 0, 1)) OVER (ORDER BY id) AS flag_sum
FROM Stadium
), T2 AS (
# 第二步,筛选出people>=100的记录,并在这个表格的基础上,使用窗口函数统计flag_sum对应的各个记录的个数,记为cnt字段,得到表格T2
SELECT
*,
COUNT(*) OVER (PARTITION BY flag_sum) AS cnt
FROM T1
WHERE people >= 100
)
# 第三步,在T2的基础上,筛选出cnt>=3的记录,并使用visit_date进行升序排列,即得到题解
SELECT id, visit_date, people
FROM T2
WHERE cnt >= 3
ORDER BY visit_date
4.执行结果










