不使用row_number()查询participation表连续3年有记录的用户
实现方案
可以在你原有SQL的基础上扩展实现,无需使用row_number(),有两种可行写法:
写法1:扩展自关联逻辑,直接匹配连续3年记录
SELECT DISTINCT name FROM participation p1 JOIN participation p2 ON p1.name = p2.name AND p2.year = p1.year + 1 JOIN participation p3 ON p1.name = p3.name AND p3.year = p1.year + 2
逻辑说明:
- 三次关联同一张表,校验同一个用户存在连续三年的参与记录(
p1.year、p1.year+1、p1.year+2均有数据) - 加
DISTINCT去重后直接输出符合要求的用户名,样例数据下返回Carol、John,自动排除不符合要求的用户
写法2:完全基于你原有SQL外层加筛选逻辑
SELECT name FROM ( -- 你原有查询逻辑,仅修正了表名拼写错误 SELECT DISTINCT p1.name, p1.year FROM participation p1, participation p2 WHERE (p1.year = p2.year + 1 OR p1.year = p2.year - 1) AND p1.name = p2.name ) t GROUP BY name HAVING COUNT(DISTINCT year) >= 3
逻辑说明:
- 内层完全保留你原有逻辑,筛选出所有存在相邻参与记录的用户年份行
- 外层按用户名分组,统计每个用户符合相邻条件的年份数量,连续3年参与的用户对应的年份数量必然>=3
- 你原有SQL中的表名
participatition拼写有误,执行时请修正为正确的participation
内容的提问来源于stack exchange,提问作者barnyard
相关产品推荐
相关产品推荐

