postgresql数据库去重方法

数据库去重有很多方法,下面列出目前理解与使用的方法

 

第一种

通过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]...;

insert into [table] select * from tmp_data1;

 


第二种

通过union去除完全重复的行,效率较高
--适合情况:这种方法只适合去除完全重复的行


select * from table1
union
select * from table1;

 

 

 

第三种

通过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);

 


第六种,对于不同的情况,不同的数据量级,可以配合使用以上五种方法,灵活使用。

 

转载于:https://www.cnblogs.com/holden1/p/9946564.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值