根据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