对具有重复项的记录重新颁发ID

lnlaulya  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(276)

我们有一个crm数据库,在过去的6周内一直在创建重复的caseid
我要进去把新的病例id的整数20000000范围给所有的副本。
所以我找到了所有像这样的复制品

SELECT CaseNumber, 
    COUNT(CaseNumber) AS NumOccurrences
FROM Goldmine.dbo.cases
WHERE CaseNumber > 9000000
GROUP BY CaseNumber
HAVING ( COUNT(CaseNumber) > 1 )

它带来了这个。

我现在需要重新编号,比如2000001,2000002,等等
任何帮助都会很好。

bt1cpqcv

bt1cpqcv1#

从数据的外观上看,您已经得到了数字上的重叠,因为如果我们要增加1,则存在与“更新的”值重叠的记录。有个办法可以解决这个问题,

with data
  as (select *
            ,count(*) over(partition by x) as cnt
            ,row_number() over(order by x) as rnk
        from t
      )
update data
   set x = x+rnk;

初始记录集

+-----------+
| orig_data |
+-----------+
|  10000009 |
|  10000009 |
|  10000009 |
|  10000009 |
|  10000010 |
|  10000010 |
|  10000011 |
+-----------+

更新后

+-----------+
| after_upd |
+-----------+
|  10000010 |
|  10000011 |
|  10000012 |
|  10000014 |
|  10000015 |
|  10000017 |
+-----------+

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=c4ea8335abb074b8c0143e2f7c767f04

dwbf0jvd

dwbf0jvd2#

我假设您使用的是sql server。因此,您可以使用可更新的CTE:

WITH dups as (
      SELECT c.*,
             ROW_NUMBER() OVER (ORDER BY CaseNumber) as seqnum
      FROM Goldmine.dbo.cases c
      WHERE CaseNumber > 9000000
     ),
     toupdate as (
      SELECT d.*, ROW_NUMBER() OVER (PARTITION BY CaseNumber ORDER BY CaseNumber) as inc
      FROM dups d
      WHERE seqnum > 1
     )
UPDATE toupdate
    SET CaseNumber = 20000000 + inc;

第一个子查询通过枚举来标识重复项。想必,你不希望“第一个”改变。所以第二个cte只选择真正的副本并分配一个序列号。外部 update 用它来分配新的号码。

相关问题