1. 程式人生 > >pg資料庫查詢重複資料並可識別空資料列重複(二)--優化

pg資料庫查詢重複資料並可識別空資料列重複(二)--優化

在上一篇文章中,實現了查詢重複資料與刪除多餘重複資料的sql編寫:http://blog.csdn.net/u011099093/article/details/78596034

但是經過匯入百萬資料測試,查詢語句直接卡住沒有結果,於是又花了一天時間對sql進行優化,在借鑑瞭如下地址的方法後,編寫出優化後的查重及去重sql:

https://yq.aliyun.com/articles/68224#15

優化查詢重複資料:SELECT A,B,C,D,E FROM( SELECT A,B,C,D,E,COUNT(*) OVER(PARTITION BY A,B,C )AS tmp FROM TABLE WHERE CONDITION) t WHERE t.tmp>=2;

優化處理重複資料:
DELETE FROM TABLE WHERE ID NOT IN(SELECT ID FROM
(SELECT MIN(ID) ID,A,B,C FROM TABLE WHERE CONDITION GROUP BY A,B,C HAVING COUNT(*)>1) C) 
AND ID IN( SELECT ID FROM 
(SELECT ID,COUNT(*) OVER(PARTITION BY A,B,C) AS tmp FROM TABLE WHERE CONDITION)t WHERE t.tmp>=2);

對於over partition的用法我真的不是很瞭解,而上述地址中對重複 資料清洗講的比較詳細,有興趣的同學可移步去看看。


-------------------------------------------11-29更新-------------------------------------------------------

經過比較發現使用row_number()函式替換count(*) 查重變得更快速,而這裡查出的重複資料發生了改變,不再是所有重複資料,而是每種都保留1條未查出,所以對應的處理SQL也會發生改變:
DELETE FROM TABLE WHERE ID IN( SELECT ID FROM 
(SELECT ID,ROW_NUMBER() OVER(PARTITION BY A,B,C) AS tmp FROM TABLE WHERE CONDITION)t WHERE t.tmp>=2);

ROW_NUMBER是一個對所查資料編號排序的函式所以如果上述查重及去重語句如果能在OVER(PARTITION BY A,B,C) AS tmp 中新增order by進行按欄位排序,結果將更加準確;