如何在SQL Server中通过单列DataFrameId删除重复行
嘿,我来帮你搞定删除OLTMS_5B0395表中重复行的问题!你提到同一DataFrameId对应了多条重复记录,下面分几种常用数据库场景给你解决方案:
针对不同数据库的解决方案
MySQL(8.0+版本,支持窗口函数)
用ROW_NUMBER()窗口函数标记重复行,然后删除序号大于1的记录(保留每组DataFrameId的第一条,这里按id排序,你也可以换成时间列Rec):
DELETE t FROM OLTMS_5B0395 t JOIN ( SELECT id, DataFrameId, ROW_NUMBER() OVER (PARTITION BY DataFrameId ORDER BY id) AS rn FROM OLTMS_5B0395 ) dup ON t.id = dup.id WHERE dup.rn > 1;
MySQL(5.x版本,不支持窗口函数)
用自连接的方式删除重复行,保留每组DataFrameId中id最小的那条:
DELETE t1 FROM OLTMS_5B0395 t1 JOIN OLTMS_5B0395 t2 ON t1.DataFrameId = t2.DataFrameId AND t1.id > t2.id;
PostgreSQL
用CTE(公共表表达式)标记重复行后删除:
WITH dup_rows AS ( SELECT id, ROW_NUMBER() OVER (PARTITION BY DataFrameId ORDER BY id) AS rn FROM OLTMS_5B0395 ) DELETE FROM OLTMS_5B0395 WHERE id IN (SELECT id FROM dup_rows WHERE rn > 1);
SQL Server
同样用CTE简化删除逻辑:
WITH dup_rows AS ( SELECT id, ROW_NUMBER() OVER (PARTITION BY DataFrameId ORDER BY id) AS rn FROM OLTMS_5B0395 ) DELETE FROM dup_rows WHERE rn > 1;
重要提醒
- 执行删除操作前,务必先备份表数据,或者先把DELETE换成SELECT语句,确认要删除的记录完全符合预期
- 如果想保留每组DataFrameId的最新记录,把ORDER BY后的
id改成Rec DESC(示例数据里的Rec是时间列) - 若需要保留特定条件的重复行,调整ORDER BY后的排序字段即可
内容的提问来源于stack exchange,提问作者krishna mohan
相关产品推荐
相关产品推荐

