需求: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;
解释
-
CTE (RankedRecords):
- 这部分定义了一个名为
RankedRecords
的 CTE,其中包含了原始表RemoteExportCode
中所有满足条件ExportCode = '10f3703cc98c4693bfe253e7846c94c3'
的记录。 - 使用
ROW_NUMBER()
函数对每个ExportCode
和FlowCode
的组合进行编号,按照Id
降序排列。这意味着对于每组相同的ExportCode
和FlowCode
,具有最大Id
的记录将获得rn = 1
的排名。
- 这部分定义了一个名为
-
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;
这将返回所有将被删除的记录,以便你确认这些确实是不需要的重复记录。
标签:删除,rn,RankedRecords,MSSQL,ExportCode,FlowCode,ID,Id From: https://www.cnblogs.com/linfenghp/p/18394735