根据Group By-SQL删除重复项

根据Group By-SQL删除重复项,sql,sql-server,group-by,duplicate-data,Sql,Sql Server,Group By,Duplicate Data,编辑:我想我现在有了解决方案,但需要做更多的感官检查 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.FireN

编辑:我想我现在有了解决方案,但需要做更多的感官检查

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
-以前的评论

我有一个基于三列的表,其中包含重复项。我可以通过执行以下操作找到它们并查看它们,然后只想删除重复项,即所有count*结果都是“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-

-这些最终都是无关紧要的:


一个简单的解决方案是使用带有行号的CTE:

这将删除除一个之外的所有数据,并保留最早的日期。要更改此逻辑,您需要按行\号更改订单


CTE的一个优点是,您可以轻松更改它,以查看要删除或更新的内容。因此,您只需用SELECT*FROM Data替换DELETE 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子句更改为任意列。

哪个dbms?删除联接是特定于产品的语法-仍然需要它-还是更通用的ANSI SQL语法?另外,删除哪些重复?您需要决定如何选择要保留的行。SQL Server Management 2014A duplicate被归类为具有相同ActionRef、FRADate和FireUPRN@Veverke,我们怎么知道没有更多的列了?也许应该保留最新或最旧的行?我可以将FRADate顺序以及它作为组的一部分取出,这样它就不相关了。我使用这个ID是因为其他地方可能发生了变化。@indofraiser:我甚至没有意识到它是这个团体的一部分。但是,我不知道您要如何排序,所以我选择了我看到的第一个日期列。替换为更有意义的内容,也可以使用多列。同样的规则也适用于常规订单。太好了,我只是想澄清一下:-
;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