分析関数を使用して重複行を削除できますか? row_number()
Oracle の SQL クエリでorrank
または dense_rank()を使用するということですか?
8 に答える
ROW_NUMBER()
たとえば、一意である必要がある列のパーティションで使用できますROW_NUMBER() OVER (PARTITION BY COLUMN1, COLUMN2 ORDER BY COLUMN1)
。行番号が 1 より大きいすべての結果は重複しています。
たとえば、それらのROWIDを返して削除することができます。
はい。しかし、集計関数を使用して少し簡単にすることができます
-- delete duplicates
delete from table t1
where t1.rowid not in (
select min(t2.rowid)
from table t2
group by t2.col1, t2.col2, ...
)
Analytical Functions
または、「DISTINCT」のような他の方法を使用Aggregate Functions
して、テーブルに重複があるかどうかを確認できます
使うのが好き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
次の手順に従って、rowid、rownum を使用せずに重複レコードを削除します。 1. 元のテーブルの個別の値を格納するテーブルを作成します。
create table newtable as select distinct * from tablename;
元のテーブルからレコードを削除します。
truncate table tablename;
一時テーブルの値を元のテーブルに挿入します。
insert into tablename select * from newtable;
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()
これは、 で並べ替えたときに両方が一意のレコードを提供するためrowid
です。
これはあなたがすべきことです:
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 );