如何从具有重复键的表中删除唯一行?

Con*_*nor 4 sql-server duplication t-sql sql-server-2012

我有以下数据:

      road        |  ID  | other column  | other column | 
------------------+------+---------------+--------------+          
MAIN ST           |  1   |     ...       |     ...      |
MAIN ST           |  2   |     ...       |     ...      |        
MAIN ST           |  3   |     ...       |     ...      |
BERRY LN          |  4   |     ...       |     ...      |
BERRY LN          |  5   |     ...       |     ...      |
BERRY LN          |  6   |     ...       |     ...      |
JOHN RD           |  7   |     ...       |     ...      |
JOHN RD           |  8   |     ...       |     ...      |
Run Code Online (Sandbox Code Playgroud)

我希望删除道路列中所有重复的行。删除哪些重复项对我来说无关紧要。最终结果可能如下所示:

      road        |  ID  | other column  | other column | 
------------------+------+---------------+--------------+          
MAIN ST           |  3   |     ...       |     ...      |
BERRY LN          |  4   |     ...       |     ...      |
JOHN RD           |  8   |     ...       |     ...      |
Run Code Online (Sandbox Code Playgroud)

id 是任何值,只要 road 列是唯一的。

在 SQL 或 T/SQL 中是否有一种简单的方法可以做到这一点?我遵循了此处的指南,但它仅适用于具有非唯一行的重复键。

Tho*_*ger 8

通过使用ROW_NUMBER()排名函数,您可以实现这一点。下面是一个例子。前两个查询仅用于数据验证。我坚信你应该看到在实际删除数据之前将要删除的内容(以及将保留的内容)。

(验证)被删除的行

;with cte as
(
    select
        *,
        row_num = 
            row_number() over (partition by road order by ID)
    from dbo.YourTable
)
select *
from cte
where row_num > 1;
Run Code Online (Sandbox Code Playgroud)

(验证)不会被删除的行

;with cte as
(
    select
        *,
        row_num = 
            row_number() over (partition by road order by ID)
    from dbo.YourTable
)
select *
from cte
where row_num = 1;
Run Code Online (Sandbox Code Playgroud)

数据删除

注意:下面的查询,当修改为适合您的环境时,实际上会删除数据。因此,在执行任何数据修改之前,您应该确保您确实要删除数据,并且还要备份数据/数据库。

;with cte as
(
    select
        *,
        row_num = 
            row_number() over (partition by road order by ID)
    from dbo.YourTable
)
delete from cte
where row_num > 1;
Run Code Online (Sandbox Code Playgroud)