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

如何在SQL中删除两列相似、一列不同的重复记录?

解决SQL中删除两列重复、一列不同的重复记录问题

嘿,我来帮你搞定这个需求!看起来你想要保留每个Name和Family组合下ID最小的那条记录,删掉其他重复的(也就是记录3和4,它们和记录1的Name、Family一致,但ID更大或者Phone_Number不同)。下面给你两种通用的解决方案,适配不同的SQL数据库版本:

方法1:使用窗口函数(适用于SQL Server、PostgreSQL、MySQL 8.0+等)

这种方法逻辑清晰,容易理解,先给每条记录按Name+Family分组并排序,标记出需要保留的第一条记录,再删除其他的:

-- 先通过CTE给每条记录标记排序序号
WITH ranked_records AS (
    SELECT 
        ID,
        -- 按Name和Family分组,每组内按ID升序排序,第一条的序号为1
        ROW_NUMBER() OVER (PARTITION BY Name, Family ORDER BY ID ASC) AS rn
    FROM your_table_name  -- 替换成你的实际表名
)
-- 删除序号大于1的记录(也就是每组中除了第一条之外的重复项)
DELETE FROM your_table_name
WHERE ID IN (SELECT ID FROM ranked_records WHERE rn > 1);

方法2:使用自连接(适用于MySQL 5.x等不支持窗口函数的版本)

如果你的数据库版本比较旧,不支持窗口函数,可以用自连接的方式来定位要删除的记录:

DELETE t1
FROM your_table_name t1
JOIN your_table_name t2 
    ON t1.Name = t2.Name 
    AND t1.Family = t2.Family 
    AND t1.ID > t2.ID;  -- 保留ID更小的那条,删除更大的

重要提示

在执行删除操作前,一定要先验证要删除的记录是否正确!可以把DELETE换成SELECT,先查看要删除的内容:
比如对于方法1,先运行:

WITH ranked_records AS (
    SELECT 
        ID,
        ROW_NUMBER() OVER (PARTITION BY Name, Family ORDER BY ID ASC) AS rn
    FROM your_table_name
)
SELECT * FROM your_table_name
WHERE ID IN (SELECT ID FROM ranked_records WHERE rn > 1);

确认返回的是记录3和4之后,再执行删除操作,避免误删数据。

内容的提问来源于stack exchange,提问作者Shahrooz_274

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:18:24