0

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

4

8 回答 8

3

您可以使用ROW_NUMBER()对您来说应该是唯一的列分区,例如:ROW_NUMBER() OVER (PARTITION BY COLUMN1, COLUMN2 ORDER BY COLUMN1). 每个行号 > 1 的结果都是重复的。

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

于 2013-03-18T08:59:51.927 回答
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
于 2013-03-18T09:10:53.480 回答
1

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

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

小提琴

于 2013-03-18T08:45:51.617 回答
1

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

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

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

     insert into tablename select * from newtable; 
    
于 2014-02-03T12:22:41.927 回答
0
DELETE FROM emp 
WHERE rowid IN
(
    SELECT rid from
    (
        SELECT rowid AS rid,
        DENSE_RANK() OVER(PARTITION BY empno ORDER BY rowid) AS rn
        FROM emp
    )
    WHERE rn > 1
);

在这里您可以同时使用两者RANK()DENSE_RANK()因为两者都会在 order by 时给出唯一的记录rowid

于 2021-10-04T21:39:28.103 回答
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
);
于 2020-08-29T07:19:06.093 回答
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
于 2021-02-04T02:29:06.617 回答
-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 );
于 2016-03-01T18:00:12.870 回答