为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:
【CPU】:
【问题描述】*:想实现字段A、字段B的组合唯一,表中重复数据很多,且每个组合的重复次数不同。如何删除重复的
可以用dense_rank()分析函数结合rowid实现,如:
1、构造重复的案例数据
create table test_duplicate(c1 varchar(50),c2 varchar(50),c3 varchar(50));
insert into test_duplicate(c1,c2,c3) values('11','A1','11A1');
insert into test_duplicate(c1,c2,c3) values('11','A1','0001');
insert into test_duplicate(c1,c2,c3) values('11','A1','0002');
insert into test_duplicate(c1,c2,c3) values('12','A2','11A2');
insert into test_duplicate(c1,c2,c3) values('13','A3','11A3');
insert into test_duplicate(c1,c2,c3) values('13','A3','0003');
insert into test_duplicate(c1,c2,c3) values('14','A4','11A4');
insert into test_duplicate(c1,c2,c3) values('14','A4','0005');
insert into test_duplicate(c1,c2,c3) values('14','A4','0006');
insert into test_duplicate(c1,c2,c3) values('14','A4','0007');
commit;
2、对c1和c2列做唯一分组,按rowid排序,ord列为1的都是唯一数据。
3、删除之前可以先把要删除的重复数据查询出来检查下
select * from test_duplicate t2
where exists (
select 1 from (
select dense_rank() over(partition by t1.c1,t1.c2 order by rowid) ord,rowid,t1.*
from test_duplicate t1
) t1
where t1.rowid=t2.rowid and t1.ord>1
);
4、确认后执行删除
delete from test_duplicate t2
where exists (
select 1 from (
select dense_rank() over(partition by t1.c1,t1.c2 order by rowid) ord,rowid,t1.*
from test_duplicate t1
) t1
where t1.rowid=t2.rowid and t1.ord>1
);
5、删除结果符合预期
可以用表的自连接和隐藏rowid实现,我这模拟了一个ID,NUM组合唯一例子,看看是不是你要的效果,红色的是执行sql之后删除的:
--查询
select rowid,* from "NUSP"."TT";
select id,num,max(rowid) from "NUSP"."TT" group by id,num having count(1) >1 ;
--删除

delete from "NUSP"."TT" a
where a.rowid!=
(select max(rowid) from "NUSP"."TT" b where a.id=b.id and a.num=b.num);