SQL SELECT 3 个具有相同值的连续记录

bar*_*ard 1 mysql sql window-functions

我想从“参与”表(名称,年份)中选择具有相同值的 3 个连续(按年份)记录:

Name    Year
-------------
Carol   1999
Carol   2000
Carol   2001
Carol   2002
Faith   1996
John    2001
John    2002
John    2003
John    2009
Lyla    1994
Lyla    1996
Lyla    1997
Run Code Online (Sandbox Code Playgroud)

这是我的初始代码:

SELECT DISTINCT p1.name, p1.year
FROM participatition p1,
     participatition p2
WHERE (p1.year = p2.year + 1 OR p1.year = p2.year - 1) AND p1.name = p2.name
ORDER BY p1.name, p1.year
Run Code Online (Sandbox Code Playgroud)

它返回所有连续记录,但我只想要满足 3 个连续条件的记录,即不是 Lyla:

Name    Year
-------------
Carol   1999
Carol   2000
Carol   2001
Carol   2002
John    2001
John    2002
John    2003
Lyla    1996
Lyla    1997
Run Code Online (Sandbox Code Playgroud)

是否可以在我的代码的基础上构建,例如添加额外的标准,以在不实现该row_number()方法的情况下细化选择?

我想要以下输出:

姓名

卡罗尔·约翰

即如果至少有 3 个连续的记录,则为所有记录

Sal*_*n A 6

将其视为间隙和岛屿问题,并使用以下技巧将连续行分组在一起:

WITH cte1 AS (
    SELECT *, Year - ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Year) AS grp
    FROM t
), cte2 AS (
    SELECT *, COUNT(*) OVER (PARTITION BY Name, grp) AS grp_count
    FROM cte1
)
SELECT *
FROM cte2
WHERE grp_count >= 3
ORDER BY Name, Year
Run Code Online (Sandbox Code Playgroud)

如果您查看grp列中的值,您会发现该模式。

数据库<>小提琴