问题描述
这是一个数据仓库项目,在其中加载一个表,其中每一列都引用另一个表。问题在于,由于该过程中的错误,许多重复的记录被加载(大约13,000),但是它们没有唯一的标识符,因此它们是完全相同的。有没有一种方法可以删除仅重复记录之一,这样我就不必删除所有内容并重复表加载过程?
解决方法
您可以使用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
window函数可确保不会在一个分区中两次分配相同的编号-您需要枚举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;
. . .
用于定义重复项的列。