Необходимо удалить дубликаты записей из таблицы, используя номер строки()


У меня есть тест таблицы, содержащий следующие данные, и я хочу удалить trsid 124, и у меня есть запись millions в моей БД, это просто scenarion. Концепция состоит в том, чтобы удалить дублирующую запись из таблицы

--------------------------------------------
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

Но если я выполню оба этих запроса, он удалит все записи из таблицы test. И если я обновлю его, обновите обе записи. Я не знаю, что я делаю неправильно здесь

3 2

3 ответа:

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

DELETE FROM cte
WHERE Row > 1

Используйте следующий запрос.

      ;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

Чтобы найти дубликаты записей, мы можем написать, как показано ниже запрос,

;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;