【发布时间】:2020-12-23 03:15:49
【问题描述】:
这是一个数据仓库项目,我在其中加载了一个表,其中每一列都引用另一个表。问题是由于过程中的错误,加载了许多重复记录(大约 13,000 条),但它们没有唯一标识符,因此它们完全相同。有没有办法只删除一条重复记录,这样我就不必删除所有内容并重复表加载过程?
【问题讨论】:
标签: sql sql-server duplicates sql-delete window-functions
这是一个数据仓库项目,我在其中加载了一个表,其中每一列都引用另一个表。问题是由于过程中的错误,加载了许多重复记录(大约 13,000 条),但它们没有唯一标识符,因此它们完全相同。有没有办法只删除一条重复记录,这样我就不必删除所有内容并重复表加载过程?
【问题讨论】:
标签: sql sql-server duplicates sql-delete window-functions
您可以使用row_number() 和 cte:
with cte as (
select row_number() over(
partition by col1, col2, ...
order by (select null)) rn
from mytable
)
delete from cte where rn > 1
窗口函数保证不会在一个分区内两次分配相同的数字 - 您需要在 partition by 子句中枚举所有列。
如果您要删除大部分行,那么清空并重新创建表可能会更简单:
create table tmptable as select distinct * from mytable;
truncate table mytable; -- back it up first!
insert into mytable select * from tmptable;
drop table tmptable;
【讨论】:
您可以使用 row_number 删除重复的行,方法是先对它们进行分区,然后按具有该分区的列之一进行排序。
如果记录完全相同,您必须列出分区中的所有列。
WITH CTE1 AS (
SELECT A.*
, ROW_NUMBER(PARTITION BY CODDIMALUMNO, (OTHER COLUMNS) ORDER BY CODDIMALUMNO) RN
FROM TABLE1 A
)
DELETE FROM CTE1
WHERE RN > 1;
【讨论】:
您可以使用row_number() 和可更新的 CTE:
with todelete as (
select t.*, row_number() over (partition by . . . ) as seqnum
from t
)
delete from todelete
where seqnum > 1;
. . . 用于定义重复的列。
【讨论】: