簡體   English   中英

刪除基於Group By - SQL的重復項

[英]Delete duplicates based on Group By - SQL

編輯:我想我現在有解決方案,但需要做一些更有意義的檢查......

DELETE TBLFIRE_TEMP3 FROM TBLFIRE_TEMP3
LEFT OUTER JOIN (
   SELECT MIN(FireNo) as FireNo, ActionRef, FRADate, FIREUPRN
   FROM TBLFIRE_TEMP3 
   GROUP BY ActionRef, FRADate, FIREUPRN
) as KeepRows ON
   TBLFIRE_TEMP3.FireNo = KeepRows.FireNo
WHERE
   KeepRows.FireNo IS NULL

- ###############上一條評論###############

我有一個重復的表(基於三列)。 我可以通過執行以下操作找到它們並查看它們然后只是想刪除重復項(即所有計數(*)結果都是'1')

SELECT COUNT(*),ActionRef, FRADate, FIREUPRN
FROM TBLTempTable
GROUP BY ActionRef, FRADate, FIREUPRN

所以我可以看到這些群體發生的次數。 我想要做的是刪除重復項。 我已經嘗試了以下但它刪除了每一行,甚至是單數:

DELETE a FROM TblTempTable a JOIN
(
  SELECT ActionRef, FRADate, FIREUPRN
    FROM TblTempTable 
   GROUP BY ActionRef, FRADate, FIREUPRN
) d 
   ON (a.ActionRef = b.ActionRef
  AND a.FRADate = b.FRADate
AND a.FIREUPRN = b.FIREUPRN)

基於我看過指南的代碼,我相信我很接近,但目前它刪除了一切。

參考:SQL- 如何刪除重復的行? GROUP BY不會刪除重復項

- 這些是MySQL所以最終不相關:

使用mysql選擇和刪除組內的行在MySQL中 查找重復的記錄

一個簡單的解決方案是使用帶有ROW_NUMBER的CTE:

WITH Data AS
(
    SELECT RN  = ROW_NUMBER() OVER (PARTITION BY ActionRef, FRADate, FIREUPRN
                                    ORDER BY FRADate ASC),
           Cnt = COUNT(*) OVER (PARTITION BY ActionRef, FRADate, FIREUPRN),
           ActionRef, FRADate, FIREUPRN
    FROM TBLTempTable
)
DELETE FROM Data
WHERE RN > 1

這將刪除除一個之外的所有內容,它保留最舊的FRADate 您需要更改ROW_NUMBERORDER BY以更改此邏輯。

CTE的一個優點是您可以輕松地更改它以查看您要刪除(或更新)的內容。 因此,您只需使用SELECT * FROM Data替換DELETE FROM Data SELECT * FROM Data

還有一種更簡單的可讀性方法:

;WITH DEDUPE AS (
SELECT ROW_NUMBER() OVER(
    PARTITION BY ActionRef, FRADate, FIREUPRN
        ORDER BY (SELECT 1)) AS RN
FROM TBLTempTable)
DELETE FROM DEDUPE
WHERE RN != 1

我們每天都在使用這個精確的腳本。 如果要根據日期列等保留較新的行,可以將ORDER BY子句更改為任何列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM