根据一列相同的值删除重复的行,但保留一条记录

时间:2018-11-01 23:53:25

标签: sql sql-server

SQL Server版本

使用service_date ='2018-08-29 13:05:00.000'删除所有重复行(第3行到第18行),但保留最旧的行(第2行),当然还要保留第1行,因为其服务日期不同。不要介意create_timestamp或document_file,因为它是同一位客户。有想法吗?

Click here for example

3 个答案:

答案 0 :(得分:7)

在SQL Server中,我们可以尝试使用CTE进行删除:

WITH cte AS (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY service_date ORDER BY create_timestamp) rn
    FROM yourTable
)

DELETE
FROM cte
WHERE rn > 1;

此处的策略是为共享同一service_date的每组记录分配一个行号,其中1个分配给该组中最老的记录。然后,我们可以通过仅定位行号更大大于1的所有记录来表述删除。

答案 1 :(得分:1)

您不需要使用分区功能。请使用以下查询以提高性能。我已经测试了它的正常工作。

with result as
        (
        select *, row_number() over(order by create_timestamp) as Row_To_Delete from TableName
        )
        delete from result where result.Row_To_Delete>2

答案 2 :(得分:0)

我认为您希望按客户删除这些数据

我的意思是,如果客户不同,您将希望保留相同日期的条目

如果您需要在partition by子句中添加用于标识duplicate rows in SQL的Customer列

通过复制和修改Tim的解决方案,您可以检查以下内容

;WITH cte AS (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY customer, service_date ORDER BY create_timestamp) rn
    FROM yourTable
)    
DELETE
FROM cte
WHERE rn > 1;