过滤重复数据

 

过滤重复数据(eliminate duplicate rows

       在一个数据仓库项目里要求对海量数据进行滤重处理。由于没有主键,而且使用的是sql server 2005,没有oracle里的rowid字段,我使用了一个临时表来实现对全字段进行对比,达到过滤重复数据的目的。

      初步考虑之后,发现有两种方法找出重复数据,group by和distinct。但是sql server里的union | union all | intersect | except,除了 union all 其他都会自动忽视重复数据,所以我没能这几个关键字想到解决办法。

下面说的重复记录是指两条以上记录的所有字段完全一致。

方案一,适用于重复率较小的情况。

1、 先把重复记录写入临时表(后缀_duplicate

INSERT INTO XX_DUPLICATE SELECT * FROM F_XX GROUP BY <ALL COLUMNS>  HAVING COUNT(*)>1;

举例子:

表结构:

create table t1(col1 int, col2 int, col3 char(50))

找出重复数据插入临时表t1_duplicate,结构和t1一样。

insert into t1_duplicate select * from t1 group by col1,col2,col3 having count(*) >1

2、 删除原表中的duplicate rows的记录。

DELETE F_XX FROM XX_DUPLICATE D left join F_XX F ON <ALL COLUMNS>;

(注意:这里用的是left join,不是inner join,我的感觉是效率更高一点。)

3、 把临时表中的记录插入到原表中,并记录日志信息。

INSERT INTO F_XX SELECT * FROM XX_DUPLICATE;

4、 删除临时表里的记录。

TRUNCATE TABLE XX_DUPLICATE

 

方案二,适用于重复率较大的情况,虽然不是很常见。主要做法是先把不重复记录(distinct)放入临时表,删除原表的所有数据,在将临时表的所有数据刷入原表。清空临时表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章