我们可以使用分析函数删除重复的行吗?我的意思是在 Oracle 的 Sql 查询中使用row_number()
or rank
or dense_rank() ?
问问题
23647 次
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;
从原始表中删除记录。
truncate table tablename;
将临时表值插入原始表。
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 回答