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;
解释
-
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;
这将返回所有将被删除的记录,以便你确认这些确实是不需要的重复记录。
分类:
SQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!