Обновите один из двух дубликатов в таблице базы данных SQL Server

У меня есть таблица, в которой есть столбец с повторяющимися значениями. Я хотел бы обновить одно из двух повторяющихся значений, например, row1 = tom и row2 = tom. Я хочу добавить один или один из одного из них, и это будет для многих других дубликатов в том же столбце. В основном просто добавьте одно число или письмо к каждому из 1 дубликатов, чтобы больше дубликатов не было.

Я получил этот запрос, который будет обновлять все дубликаты, но не один из них. Может ли кто-нибудь помочь?

UPDATE Table1
   SET Column1 = 'a'
 WHERE exists
       (SELECT Column1 , COUNT(Column1 )
FROM Clients
GROUP BY Column1 
HAVING ( COUNT(Column1 ) > 1)
)

Ответ 1

Попробуйте это с помощью CTE и PARTITION BY

;WITH cte AS
(
  SELECT
      ROW_NUMBER() OVER(PARTITION BY Column1  ORDER BY Column1 ) AS rno,
      Column1 
  FROM Clients
)

UPDATE cte SET Column1 =Column1 +' 1 '
WHERE rno=2

Ответ 2

Я думаю, что это простое обновление - то, что вы ищете;

UPDATE Table1 SET Column1=Column1+CAST(id AS VARCHAR)
WHERE id NOT IN (
  SELECT MIN(id) 
  FROM Table1
  GROUP BY Column1
);

Входные данные:

(1,'A'),
(2,'B'),
(3,'A'),
(4,'C'),
(5,'C'),
(6,'A');

Выход:

(1,'A'),
(2,'B'),
(3,'A3'),
(4,'C'),
(5,'C5'),
(6,'A6');

SQLfiddle для тестирования.

Ответ 3

Я думаю, вы можете использовать оператор TOP() вместо метода row_number(), это поможет вам обновить его простым и простым способом.

UPDATE TOP ( 1 )Table1 SET Column1 = 'a';

Ответ 4

Предположим Table1, содержащий следующую информацию:

Column1      
========  
tom        
john   
jack    
tom     
james
jane 

Обратите внимание, что первая и четвертая строки идентичны. Здесь команда UPDATE для изменения имени только в одном из них.

UPDATE Table1 AS t1
   SET Column1 = 'jennifer'
 WHERE rrn(t1) =
       (SELECT MAX(rrn(t2))
          FROM Table1 AS t2
         WHERE Column1 = 'tom')

И результатом будет

Column1      
========  
tom        
john   
jack    
jennifer
james
jane 

с функцией RRN вы можете обновить последнее обнаружение дублированной записи

Ответ 5

Если у нас есть это условие:

SELECT Column1 FROM Clients ORDER BY Column1

Column1
**********
Jhon
Jhon
Mike
Mike
Mike
Robert

Это будет работать, даже если Column1 был дублирован n раз, он добавит номер строки к каждой дублирующейся строке, кроме первой, попробуйте это:

BEGIN 

;WITH CTE AS 
(
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY Column1 ORDER BY Column1) AS ROWNUMBER,
        Column1
    FROM Clients
)

UPDATE CTE 
SET Column1 = CONCAT(Column1, ' ', (ROWNUMBER - 1))
WHERE ROWNUMBER > 1

SELECT Column1 FROM Clients ORDER BY Column1

END 

Результат:

Column1
***********
Jhon
Jhon 1
Mike
Mike 1
Mike 2
Robert

Ответ 6

Попробуйте этот помощник

UPDATE Table1 
SET Column1 = column1 +'a'   
WHERE exists(
        select row 
        from (
            SELECT 
                Column1 , 
                Row_Number() over(Partition by Column1 order by Column1) as row 
            FROM Clients
        ) as subquery 
        where subquery.row = 2
    )

Ответ 7

Мне пришлось помещать внутри внутри, так как мой разработчик sql не хотел обновлять Копирование из ответа Нитеша

он выглядел так:

UPDATE Clients 
SET Column1 = 'a'
WHERE ColumnID IN (select ColumnID from 
 (  
 SELECT
       row_number() OVER(PARTITION BY Column1  ORDER BY Column1 ) AS rno,
       ColumnID FROM Clients
 )
                   where rno=2   
                  )

Ответ 8

попробуй это

with test as 
(
   select ROW_NUMBER() over (order by salary)rr, salary , emp_no 
   from salary
)update test set emp_no=10007 where emp_no='10002'  and rr=3

Ответ 9

UPDATE table1
SET STATUS = 'F'
WHERE column1= 
   (SELECT (column1)
    FROM table1
    GROUP BY column1 
    HAVING (COUNT(column1 ) > 1))