当没有标识列时,如何删除重复记录(SQL)?
这是一个数据仓库项目,我在其中加载一个表,其中每列引用另一个表。问题是,由于过程中的错误,加载了许多重复记录(约13000条),但它们没有唯一标识符,因此它们完全相同。有没有办法只删除其中一条重复记录,这样我就不必删除所有内容并重复表加载过程当没有标识列时,如何删除重复记录(SQL)?,sql,sql-server,duplicates,sql-delete,window-functions,Sql,Sql Server,Duplicates,Sql Delete,Window Functions,这是一个数据仓库项目,我在其中加载一个表,其中每列引用另一个表。问题是,由于过程中的错误,加载了许多重复记录(约13000条),但它们没有唯一标识符,因此它们完全相同。有没有办法只删除其中一条重复记录,这样我就不必删除所有内容并重复表加载过程 您可以使用行编号()和cte: with cte as ( select row_number() over( partition by col1, col2, ... order by (select null)
您可以使用
行编号()
和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
窗口函数保证同一个数字在一个分区内不会被分配两次-您需要通过子句枚举分区中的所有列
如果要删除大部分行,则清空并重新创建表可能更简单:
create table tmptable as select distinct * from mytable;
truncate table mytable; -- back it up first!
insert into mytable select * from tmptable;
drop table tmptable;
您可以使用行编号()
和可更新的CTE:
with todelete as (
select t.*, row_number() over (partition by . . . ) as seqnum
from t
)
delete from todelete
where seqnum > 1;
用于定义重复的列。您可以使用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;