数据库去重有不少方法,下面列出目前理解与使用的方法数据库
第一种函数
经过group by分组,而后将分组后的数据写入临时表而后再写入另外的表,对于没有出现再group by后面的field能够用函数max,min提取,效率较高
--适合状况:这种状况适合重复率很是高的状况,通常来讲重复率超过5成则能够考虑用这个方法
--优势:对于重复率高的数据集的去重,十分推荐用这种方法
--缺点:uuid不能用max或min提取,若是须要去重的数据集中包含uuid则十分尴尬 测试
create temp table tmp_data1 as
select [field1],[field2]...,max(field_special),min(field_special) from group by [field1],[field2]...;ui
insert into [table] select * from tmp_data1;
spa
第二种ci
经过union去除彻底重复的行,效率较高
--适合状况:这种方法只适合去除彻底重复的行 it
select * from table1
union
select * from table1;io
第三种table
经过group by加id加not in,即先用group by分组,而后取出该分组下最大或最小的id组成集合,而后配合not in过滤掉重复的数据,效率很低,能够尝试配合临时表(测试发现依旧很慢)效率
--适合状况:因为该种方法效率很低,因此不推荐使用,若是数据量不大的状况下能够用这种方法,数据量只要上了100万就会很慢很慢
delete from [table] where id not in (select max(id) from table1 group by [field1],[field2]...);
第四种
经过group by加having加in,即先用group by分组,而后用having count(*)>1取出分组数量大于1的行(即重复的行),而后用in删除重复行,效率较高
--适合状况:一条数据大概只有一到两三条重复,这种方法一次只能删除重复数据的一条,若是有些数据有几百次重复那就会累死,其实也可使用函数作一个循环,但这样的效率就不高了
delete from [table] where id in (select max(id) from [table] group by [field1],[field2]... having count(*)>1);
第五种
使用窗口函数加id,便可以使用窗口函数将数据分组,并将每一个分组按行排号,并将行号与id(惟一id)存入一个集合里,这样就能够根据这个集合来取处重复行的id,即经过行号>1,
-- 而后根据id删除重复行,效率很高(100万数据,重复9万,时间: 14.596s)
--适合状况:该种方法效率很高,特别推荐使用,但须要了解窗口函数以及其中的一些关键词的意义
--row_number() 为返回的记录定义个行编号
--over 与row_number()函数配套使用
--partition by [field1],[field2]... 根据指定的字段分组
delete from [table] where id in (select id from (select row_number() over (partition by [field1],[field2]...), id from [table]) as t where t.row_number>1);
第六种,对于不一样的状况,不一样的数据量级,能够配合使用以上五种方法,灵活使用。