【LeetCode601. 体育馆的人流量】MySQL 使用lag,lead得到该行记录所在连续段长度

yhm138 / 2023-08-14 / 原文

目录
  • 题目地址
  • 代码

题目地址

https://leetcode.cn/problems/human-traffic-of-stadium/description/

代码


# # Write your MySQL query statement below

# # 本质上就是连续签到问题呗

# SELECT  Version() # 8.0.33,用户变量编程用不了

with t1 as(
    SELECT * from stadium where people>=100 order by id asc
)
,
Ranked AS (
    SELECT *,
           LAG(id, 1, id - 1) OVER (ORDER BY id) AS prev_id,
           LEAD(id, 1, id + 1) OVER (ORDER BY id) AS next_id
    FROM t1
)
, 
Segments AS (
    SELECT *, 
           CASE 
               WHEN id - prev_id > 1 THEN 1
               ELSE 0
           END AS is_start,
           CASE 
               WHEN next_id - id > 1 THEN 1
               ELSE 0
           END AS is_end
    FROM Ranked
)
, 
GroupsWithNumber AS (
    SELECT *,
           SUM(is_start) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS group_num
    FROM Segments
)



select id,visit_date,people from 
    (SELECT *,
    COUNT(id) OVER (PARTITION BY group_num) AS segment_length
    FROM GroupsWithNumber
    ORDER BY id) t2
where segment_length>=3