需要使用row_number()从表中删除重复记录

时间:2016-09-19 03:05:28

标签: sql sql-server-2008 row-number

我正在进行表格测试,其数据如下,我想删除trsid 124,我在数据库中有数百万条目,这只是一个风景。概念是从表中删除重复的条目

--------------------------------------------
TrsId   |   ID  |   Name    |
--------------------------------------------    
123     |   1   |   ABC     |   
124     |   1   |   ABC     |

我正在尝试像

这样的东西
delete from test
select T.* from
(
    select ROW_NUMBER() over (partition by ID order by name) as r,
           Trsid,
           ID,
           name
    from test
) t
where r = 2

即使我更新了对我来说好的查询

update test set id=NULL
select T.* from
(
    select ROW_NUMBER() over (partition by ID order by name) as r,
           Trsid,
           ID,
           name
    from test
) t
where r = 2

但是如果我同时运行这个查询,它会从表测试中删除所有记录。如果我更新它更新两个记录。 我不知道我在做错了什么

4 个答案:

答案 0 :(得分:2)

WITH cte AS
(
    SELECT ROW_NUMBER() OVER(PARTITION by ID ORDER BY name) AS Row
    FROM test
)

DELETE FROM cte
WHERE Row > 1

答案 1 :(得分:0)

使用以下查询。

      ;WITH cte_1
         AS (SELECT ROW_NUMBER() OVER(PARTITION BY ID,NAME ORDER BY TrsId ) Rno,*
               FROM YourTable)
         DELETE
         FROM cte_1
         WHERE RNO>1

答案 2 :(得分:0)

WITH cte_DUP AS (
SELECT * FROM (
select <col1,col2,col3..coln>, row_number() 
over(partition by <col1,col2,col3..coln>
order by <col1,col2,col3..coln>  ) rownumber  
from <your table> ) AB  WHERE  rownumber > 1)

DELETE FROM cte_DUP WHERE ROWNUMBER > 1

答案 3 :(得分:-2)

要查找重复记录,我们可以像下面的查询一样编写

;WITH dup_val 
     AS (SELECT a, 
                b, 
                Row_number() 
                  OVER( 
                    partition BY a, b 
                    ORDER BY b, NAME)AS [RANK] 
         FROM   table_name) 
SELECT * 
FROM   dup_val 
WHERE  [rank] <> 1;