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]...;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);

 


第六種,對於不一樣的狀況,不一樣的數據量級,能夠配合使用以上五種方法,靈活使用。

相關文章
相關標籤/搜索