You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:05:20