使用分析功能删除重复的行

时间:2013-03-18 08:33:26

标签: sql oracle duplicates rows analytical

我们可以使用分析函数删除重复的行吗?我的意思是在Oracle的Sql查询中使用row_number()rank或dense_rank()?

7 个答案:

答案 0 :(得分:2)

您可以在对您而言唯一的列分区上使用ROW_NUMBER(),例如:ROW_NUMBER() OVER (PARTITION BY COLUMN1, COLUMN2 ORDER BY COLUMN1)。每个结果都有一个rownumber> 1是重复。

然后,您可以为这些返回rowid并删除它们。

答案 1 :(得分:1)

我们可以使用Analytical Functions或任何其他方式,例如Aggregate Functions,'DISTINCT`来查明我们的表格中是否有重复

喜欢使用Analytical Functions

select col1,col2,col3 from (select tbl.*,rowid rid,row_number() over (partition by col1,col2,col3 order by col1) rnum
from tbl) where rnum>1;

但要删除它们,我们需要获得ROWID

rnum>1
delete from tbl where rowid in 
(select rid from (select tbl.*,rowid rid,row_number() over (partition by col1,col2,col3 order by col1) rnum
  from tbl) where rnum>1)

或者我们可以简单地使用

 create new_table as select distinct * from old_table

答案 2 :(得分:1)

按照以下步骤删除重复记录,而不使用rowid,rownum 1.创建表以存储原始表的不同值。

    create table newtable as select distinct * from tablename;
  1. 从原始表中删除记录。

     truncate table tablename;
    
  2. 将临时表值插入原始表。

     insert into tablename select * from newtable; 
    

答案 3 :(得分:0)

是。但是使用聚合函数可以使它更简单

-- delete duplicates
delete from table t1
where t1.rowid not in (
   select min(t2.rowid)
   from table t2
   group by t2.col1, t2.col2, ...
)

fiddle

答案 4 :(得分:0)

您可以使用以下查询删除重复的行:

DELETE FROM EMP
WHERE ROWID IN
(
SELECT RID FROM
(SELECT ROWID RID,ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY ROWID) R FROM EMP) 
WHERE R>1
);

答案 5 :(得分:0)

假设我们要从 emp 表中删除重复的 sal:

select * from (
  select 
    empno, 
    ename, 
    sal, 
    row_number() over (partition by sal order by sal asc) rw_number
  from emp)
where rw_number = 1

答案 6 :(得分:-1)

这是你应该做的事情:

DELETE  FROM emp
WHERE   rowid IN (
        SELECT  rid
        FROM    (
                  SELECT    rowid rid ,
                            DENSE_RANK() OVER ( PARTITION BY empno ORDER BY rowid ) rn
                  FROM      emp
                ) AS RR
        WHERE   rn > 1 );