一、2條及2條以內的重復
問題
如圖有兩列,第一列是主鍵,第二列是產品編碼,其中產品編碼有重復數據,我現在需要刪除這部分編碼重復的數據
方法
利用having +聚合函數
SELECT MIN(FID) FID,FProductCode FROM #table where FDate='2022-04-20' GROUP BY FProductCode HAVING COUNT(1) > 1
查詢出來的就是一半的重復數據
實現
刪除重復數據
--刪除重復數據 update #table set FDelete=1,exchange_status=0 where FID IN( SELECT MIN(FID) FID,FProductCode FROM #table where FDate='2022-04-20' GROUP BY FProductCode HAVING COUNT(1) > 1 )
----------------------------------------------------------------------------------
二、大於2條的重復
如圖所示:這種情況下如何去重呢?
一句話概括:查找表中所有重復的數據編碼,且這部分編碼的主鍵不是最小值的那個
--1、查詢所有去重后的編碼 --2、查詢這些去重后的編碼的主鍵FID --即:根據單字段,刪除表中該字段重復出現記錄,保留最小主鍵ID
UPDATE MY_SP_StereoScopicStock SET FDelete=1,exchange_status=0 WHERE FDate='2022-05-30' AND FProductCode IN (SELECT FProductCode FROM MY_SP_StereoScopicStock where FDate='2022-05-30' GROUP BY FProductCode HAVING COUNT(FProductCode) > 1 ) AND FID NOT IN (SELECT MIN(FID) FROM MY_SP_StereoScopicStock where FDate='2022-05-30' GROUP BY FProductCode HAVING COUNT(FProductCode)>1)