为了账号安全,请及时绑定邮箱和手机立即绑定

T-SQL:删除所有重复的行,但保留一个

/ 猿问

T-SQL:删除所有重复的行,但保留一个

慕雪6442864 2019-09-18 14:47:26

我有一个行数非常多的表。不允许重复,但由于行如何创建的问题我知道这个表中有一些重复。我需要从关键列的角度消除额外的行。其他一些列的数据可能略有不同,但我并不关心。我仍然需要保留其中一行。SELECT DISTINCT将无法工作,因为它在所有列上运行,我需要根据键列抑制重复。

如何删除额外的行但仍保持有效?


查看完整描述

3 回答

?
幕布斯6054654

您没有说明您使用的是哪个版本,但在SQL 2005及更高版本中,您可以使用带有OVER子句的公用表表达式。它有点像这样:


WITH cte AS (

  SELECT[foo], [bar], 

     row_number() OVER(PARTITION BY foo, bar ORDER BY baz) AS [rn]

  FROM TABLE

)

DELETE cte WHERE [rn] > 1

玩弄它,看看你得到了什么。


(编辑:为了有所帮助,有人编辑了ORDER BYCTE中的条款。要清楚,你可以按照你想要的任何顺序排序,它不一定是cte返回的列之一。事实上,一个常见的在这里使用情况是“富,酒吧”是组标识符和“巴兹”是某种形式的时间戳。为了保持最新,你会怎么做ORDER BY baz desc)


查看完整回答
反对 回复 2019-09-18
?
慕仰1329654

示例查询:


DELETE FROM Table

WHERE ID NOT IN

(

SELECT MIN(ID)

FROM Table

GROUP BY Field1, Field2, Field3, ...

)

以下fields是您要对重复行进行分组的列。


查看完整回答
反对 回复 2019-09-18
?
呼唤远方

这是我对它的一种扭曲,有一个可运行的例子。请注意,这仅适用于唯一的情况Id,并且您在其他列中具有重复值。


DECLARE @SampleData AS TABLE (Id int, Duplicate varchar(20))


INSERT INTO @SampleData

SELECT 1, 'ABC' UNION ALL

SELECT 2, 'ABC' UNION ALL

SELECT 3, 'LMN' UNION ALL

SELECT 4, 'XYZ' UNION ALL

SELECT 5, 'XYZ'


DELETE FROM @SampleData WHERE Id IN (

    SELECT Id FROM (

        SELECT 

            Id

            ,ROW_NUMBER() OVER (PARTITION BY [Duplicate] ORDER BY Id) AS [ItemNumber]

            -- Change the partition columns to include the ones that make the row distinct

        FROM 

            @SampleData

    ) a WHERE ItemNumber > 1 -- Keep only the first unique item

)


SELECT * FROM @SampleData

结果如下:


Id          Duplicate

----------- ---------

1           ABC

3           LMN

4           XYZ

不知道为什么这就是我首先想到的......绝对不是最简单的方法,但它有效。


查看完整回答
反对 回复 2019-09-18

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信