如何在SQL中按姓氏和名字筛选重复记录?
筛选姓氏和名字均重复的数据行
要返回peoplelist表中姓氏(lastName)和名字组合完全重复的所有行,你需要基于「姓氏+名字」的组合统计重复次数,而非单独按姓氏统计。以下是两种可行的修改方案:
方案1:简化的窗口函数实现
直接在原表上通过窗口函数按姓名组合分组计数,筛选重复次数大于1的行即可,无需多层CTE:
WITH duplicate_names AS ( SELECT *, COUNT(*) OVER (PARTITION BY lastName, firstName) AS name_count FROM peoplelist ) SELECT * FROM duplicate_names WHERE name_count > 1 ORDER BY lastName DESC;
注意:如果你的名字列不是
firstName,请替换为实际列名(如givenName、first_name等)。
方案2:适配你原有CTE的修改版本
如果你想沿用自己的CTE结构,只需将分组条件改为姓名组合,同时关联时匹配两个字段:
WITH cte1 AS ( SELECT lastName, firstName, COUNT(*) OVER (PARTITION BY lastName, firstName) AS name_count FROM peoplelist ), cte2 AS ( SELECT ng.* FROM peoplelist ng INNER JOIN cte1 ON cte1.lastName = ng.lastName AND cte1.firstName = ng.firstName WHERE cte1.name_count > 1 ORDER BY lastName DESC ) SELECT * FROM cte2;
原代码的问题说明
你原来的CTE仅按lastName分组计数,只能筛选出姓氏重复的行,但无法区分「同姓不同名」的情况,会返回所有同姓记录而非真正的姓名全重复行。修改后通过PARTITION BY lastName, firstName确保统计的是完整姓名组合的重复次数,精准筛选出你需要的结果。
内容的提问来源于stack exchange,提问作者gollumsoprano
相关产品推荐
相关产品推荐

