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 中是否有一种简单的方法可以做到这一点?我遵循了此处的指南,但它仅适用于具有非唯一行的重复键。
通过使用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)
| 归档时间: |
|
| 查看次数: |
4877 次 |
| 最近记录: |