最近一直为greenplum去重问题烦心,原本以为很简单的一个问题,使用distinct就可以解决,但是实际操作起来却发现并没有那么简单。还是请教了一些大神才解决这个问题,于是心想记录下来。下面就说说大神是怎么做的吧。
1、确定重要字段
假设你的字段有很多,但是你不知道哪些字段比较重要的(使用这些字段可以区分不行同的数据),那么你就需要逐一检验。
如:
select a,b,count(*) from C group by a,b having count(*)>1;
这里的a,b为你的字段名,C为你的表名,然后查看选出了多少数据,如果你不想顺便查看选出的数据,那就直接使用
select count(*) from (select a,b,count(*) from C group by a,b having count(*)>1)a;
然后你逐渐的添加字段,直到选出的数据基本趋于稳定为止。
2、新建一个表,用来存储重复的数据。
这里我们就可以选择几个重要的字段,把数据库中的重复数据导入到一个新的表中。如我们选择a,b字段
select m.* into C2 from
(select a,b,count(*) from C group by a,b having count(*)>1) n,C m where m.a=n.a and
m.b=n.b;
3、从表中删除选出导表C2的数据
Delete from C where (a,b) in (select a,b from C2);
4、从C2表中删除重复的数据。(假设你已经筛选出了重要的字段为a,b,d,e,f,g)
delete from C2 m where (gp_segment_id, ctid) not in (select gp_segment_id, min(ctid) from C2 n group by gp_segment_id,n.a,n.b,n.d,n.e,n.f,n.g);
5、把数据导回大表C
Insert into C select * from C2;