[英]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所以最终不相关:
一个简单的解决方案是使用带有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_NUMBER
的ORDER 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.