更新sql server数据库表中的两个重复项之一

更新sql server数据库表中的两个重复项之一,sql,sql-server,Sql,Sql Server,我有一个表,其中有一列具有重复值。我想更新2个重复值中的一个,例如row1=tom和row2=tom。。我想给其中一个添加1或a,这将用于同一列中的许多其他副本。基本上只需在每1个副本中添加一个数字或字母,这样就不会有更多的副本 我得到了这个查询,它将更新所有的副本,但不会更新其中一个。有人能帮忙吗 UPDATE Table1 SET Column1 = 'a' WHERE exists (SELECT Column1 , COUNT(Column1 ) FROM Clie

我有一个表,其中有一列具有重复值。我想更新2个重复值中的一个,例如row1=tom和row2=tom。。我想给其中一个添加1或a,这将用于同一列中的许多其他副本。基本上只需在每1个副本中添加一个数字或字母,这样就不会有更多的副本

我得到了这个查询,它将更新所有的副本,但不会更新其中一个。有人能帮忙吗

UPDATE Table1
   SET Column1 = 'a'
 WHERE exists
       (SELECT Column1 , COUNT(Column1 )
FROM Clients
GROUP BY Column1 
HAVING ( COUNT(Column1 ) > 1)
)
假设表1包含以下信息:

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功能,您可以更新最近发生的重复记录

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
    )

我认为这个简单的更新就是你想要的

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');
.

尝试使用CTE和分区


我认为你可以用TOP运算符代替row_number方法,它将帮助你以简单易行的方式更新一个

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

由于我的sql开发人员不喜欢使用更新,我不得不将with放入from中 从尼瑟斯的答案中抄袭

结果是这样的:

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   
                  )
试试这个

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

使用子查询可能有效:

更新表1 设置状态='F' 其中第1列= 选择第1列 来自表1 按列分组1 具有计数列1>1的
如果我们有这种情况:

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
运行此脚本时,所有sku描述都在更新


输出:仅1行应受到影响

我找到了此解决方案:

我的表格设备已经有数据,序列列应该是唯一的。id是主键。在原始值之后连接一个随机的6位值

UPDATE devices 
SET serial=CONCAT(serial,'_',LPAD(FLOOR(RAND() * 999999.99), 6, '0'))    
    where id in 
    (select * FROM( 
        SELECT d1.id as id 
        FROM devices as d1, devices as d2 
        WHERE d1.id <> d2.id and d1.serial=d2.serial) as subdevices
    )
免责声明:

查询语言:Microsoft SQL查询 评论中阐明了步骤,如:- 问题:使用“D”更新上一个Id,其中年、月是重复的成员

-- Sample Table Creation

DECLARE @TempTable TABLE
( Id INT IDENTITY (1, 1) NOT NULL, MemberId INT, for_year INT, for_month INT, for_status CHAR(1) )

-- Sample Insert
INSERT INTO @TempTable
SELECT '2', '2077', '11', 'A' UNION ALL
SELECT '2', '2077', '12', 'A' UNION ALL
SELECT '2', '2077', '12', 'A' UNION ALL
SELECT '3', '2077', '11', 'A' UNION ALL
SELECT '3', '2077', '12', 'A' UNION ALL
SELECT '3', '2077', '12', 'A' UNION ALL
SELECT '77', '2076', '10', 'A' UNION ALL
SELECT '77', '2076', '11', 'A' UNION ALL
SELECT '77', '2076', '12', 'A'

-- where expectation meets reality :) -- logic / main query
UPDATE @TempTable SET for_status = 'D' WHERE Id IN 
(
SELECT MAX(Id) FROM @TempTable GROUP BY MemberId, for_year, for_month HAVING COUNT(*)>1
)

-- Sample Select
SELECT * FROM @TempTable

如果是重复记录,为什么需要保留?这样做有具体的原因吗?您的模式是什么样子的?有什么主键可以使用吗?我需要它,因为它是有价值的信息,我不想删除它们。为了数据分析的目的,我们只想区分它们。是的,我有一个ID,它是主键。这会将任何tom更改为我不想要的。我有一个大数据,那个专栏有很多重复。我只想在其中一个副本的末尾添加一个字母或递增的数字,而不是手动添加。它拒绝在更新后接受AS t1。。为什么?它正在更新所有行。我是说所有重复的行请确定你的答案。通常我认为答案会让你的答案不太可能被选中。这是最好的答案。它使用应用程序中的正确工具,不是一种解决方法。此外,它还可以工作-它刚刚解决了我遇到的问题。欢迎使用堆栈溢出。请提供一些解释,说明这是如何解决提问者的问题的,以便将来的用户可以从您的回答中学习。您不想更新客户表而不是cte,因为cte只是一个临时的东西吗?PostgreSQL拒绝了这种语法。我最终得到的结果更像是:更新客户机集Column1=Column1+'1',其中cte.rno=2;欢迎来到StackOverflow。虽然这段代码可能会解决这个问题,包括如何以及为什么解决这个问题的解释将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请编辑您的答案,添加解释,并说明适用的限制和假设。
UPDATE devices 
SET serial=CONCAT(serial,'_',LPAD(FLOOR(RAND() * 999999.99), 6, '0'))    
    where id in 
    (select * FROM( 
        SELECT d1.id as id 
        FROM devices as d1, devices as d2 
        WHERE d1.id <> d2.id and d1.serial=d2.serial) as subdevices
    )
-- Sample Table Creation

DECLARE @TempTable TABLE
( Id INT IDENTITY (1, 1) NOT NULL, MemberId INT, for_year INT, for_month INT, for_status CHAR(1) )

-- Sample Insert
INSERT INTO @TempTable
SELECT '2', '2077', '11', 'A' UNION ALL
SELECT '2', '2077', '12', 'A' UNION ALL
SELECT '2', '2077', '12', 'A' UNION ALL
SELECT '3', '2077', '11', 'A' UNION ALL
SELECT '3', '2077', '12', 'A' UNION ALL
SELECT '3', '2077', '12', 'A' UNION ALL
SELECT '77', '2076', '10', 'A' UNION ALL
SELECT '77', '2076', '11', 'A' UNION ALL
SELECT '77', '2076', '12', 'A'

-- where expectation meets reality :) -- logic / main query
UPDATE @TempTable SET for_status = 'D' WHERE Id IN 
(
SELECT MAX(Id) FROM @TempTable GROUP BY MemberId, for_year, for_month HAVING COUNT(*)>1
)

-- Sample Select
SELECT * FROM @TempTable