MSSQL根据特定字段删除并保留ID最大的一条数据

需求:MSSQL的,只保留一条数据,表是 RemoteExportCode,字段有ExportCode, FlowCode,Id 根据ExportCode = '10f3703cc98c4693bfe253e7846c94c3' 来删除重复的FlowCode ,只保留ID大的那一条  

思路:在 RemoteExportCode 表中根据 ExportCode 值 '10f3703cc98c4693bfe253e7846c94c3' 删除重复的 FlowCode 记录,同时保留具有最大 Id 的记录,你可以使用 SQL Server 的 CTE(Common Table Expressions,公共表表达式)来辅助完成这个任务。

WITH RankedRecords AS (
    SELECT
        ExportCode,
        FlowCode,
        Id,
        ROW_NUMBER() OVER (PARTITION BY ExportCode, FlowCode ORDER BY Id DESC) AS rn
    FROM
        RemoteExportCode
    WHERE
        ExportCode = '10f3703cc98c4693bfe253e7846c94c3'
)
DELETE FROM RankedRecords
WHERE
    rn > 1;

解释

  1. CTE (RankedRecords):

    • 这部分定义了一个名为 RankedRecords 的 CTE,其中包含了原始表 RemoteExportCode 中所有满足条件 ExportCode = '10f3703cc98c4693bfe253e7846c94c3' 的记录。
    • 使用 ROW_NUMBER() 函数对每个 ExportCode 和 FlowCode 的组合进行编号,按照 Id 降序排列。这意味着对于每组相同的 ExportCode 和 FlowCode,具有最大 Id 的记录将获得 rn = 1 的排名。
  2. DELETE 语句:

    • 从 RankedRecords CTE 中删除所有 rn > 1 的记录。这意味着除了具有最大 Id 的记录外,其他记录都将被删除。

这个查询将有效地删除所有重复的 FlowCode 记录,只保留具有最大 Id 的记录。请注意,在执行删除操作之前,最好先备份数据或在一个测试环境中验证查询的正确性。

如果你想要验证这个查询是否正确工作,可以在删除之前先使用 SELECT 语句来查看结果:

WITH RankedRecords AS (
    SELECT
        ExportCode,
        FlowCode,
        Id,
        ROW_NUMBER() OVER (PARTITION BY ExportCode, FlowCode ORDER BY Id DESC) AS rn
    FROM
        RemoteExportCode
    WHERE
        ExportCode = '10f3703cc98c4693bfe253e7846c94c3'
)
SELECT *
FROM RankedRecords
WHERE rn > 1;

这将返回所有将被删除的记录,以便你确认这些确实是不需要的重复记录。

posted @ 2024-09-03 15:40  _Vincent  阅读(10)  评论(0编辑  收藏  举报