SQL - 如何按上次输入的值删除重复的行?

时间:2012-01-23 13:55:10

标签: sql sql-server duplicate-removal

我从此链接获得此代码:How can I remove duplicate rows?

 ;WITH cte
 AS (SELECT ROW_NUMBER() OVER (PARTITION BY person_id, date_work, hours
                                   ORDER BY ( SELECT 0)) RN
     FROM   work_hours)
 DELETE FROM cte
 WHERE  RN > 1

是否可以删除第一个输入的重复行,或者我应该有一个额外的列date_of_entry?我想这样做,如果我输入相同的date_work和不同的小时PARTITION BY person_id, date_work,它会随机删除重复项。

如果不可能,我如何删除较高时间的重复项?

3 个答案:

答案 0 :(得分:6)

添加order by hours desc

;WITH cte
 AS (SELECT ROW_NUMBER() OVER (PARTITION BY person_id, date_work
                                   ORDER BY hours DESC) RN
     FROM   work_hours)
 DELETE FROM cte
 WHERE  RN > 1

答案 1 :(得分:4)

是 - 你或者必须引入date_of_entry字段或其他一些像IDENTITY这样的矢量字段。例如,如果列Id是您的INT IDENTITY,那么您的查询将如下所示:

 ;WITH cte
 AS (SELECT ROW_NUMBER() OVER (PARTITION BY person_id, date_work, hours
                                   ORDER BY ( SELECT Id DESC)) RN
     FROM   work_hours)
 DELETE FROM cte
 WHERE  RN > 1

当然如果没有人更改IDENTITY栏中的值

,则有效

如果您的条件适合 - 那么您可能希望使用列Hours作为person_id, date_work

分组范围内的向量字段

更好的方法就是UNIQUE INDEX超过person_id, date_work, hours列,然后就没有能力添加重复项了。

答案 2 :(得分:3)