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 个连续的记录,则为所有记录
将其视为间隙和岛屿问题,并使用以下技巧将连续行分组在一起:
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列中的值,您会发现该模式。
| 归档时间: |
|
| 查看次数: |
11557 次 |
| 最近记录: |