【问题标题】:Find duplicate ID and add new sequence ID查找重复 ID 并添加新的序列 ID
【发布时间】:2018-11-16 01:58:18
【问题描述】:

我有一个表,其中 ID 必须是唯一的。有些 ID 不是唯一的。如何生成一个向此 ID 添加序列的新列?我想在下表中生成 ID_new_generated

ID Company Name ID_new_generated
1  A            1
1  B            1_2
2  C            2

【问题讨论】:

  • id 列中没有使用primary keyunique 之类的约束吗?我认为最好修复数据而不是这样做..

标签: sql duplicates sequence


【解决方案1】:

您可以使用窗口函数(例如 Rank)在由具有相同 ID 号的行定义的每个窗口上生成辅助 ID,然后将其连接起来以创建新的。

类似:

select 
    ID
    , companyName
    , rank() over(partition by ID ORDER BY companyName)
    , concat(ID, '_',  rank() over(partition by ID ORDER BY companyName)) as new_id
from test;

查看此演示:https://www.db-fiddle.com/f/bd6aQKnZ7gcZCQjFpZicrp/0

根据您使用的 sql,语法会有所不同。

【讨论】:

    【解决方案2】:

    假设您正在 SQL Server 中寻找解决方案:

    首先,您需要添加一个可为空的列 ID_Generated,如下所示:

    ALTER TABLE tablename
    ADD COLUMN ID_Generated varchar(25) null
    GO
    

    然后,在 cte 结构中使用如下所示的 row_number(如果您使用的是 mysql,则可以使用临时表):

    ;with cte as (
       SELECT DISTINCT t.ID,  
                       (ROW_NUMBER() over (partition by t.ID order by t.ID)) as RowNumber
       FROM tablename t
       INNER JOIN (select ID, Count(*) RecCount
                   From tablename
                   group by ID
                   having Count(*) > 1) tt on t.ID = t.ID 
       ORDER BY id ASC
    )
    Update t
    set t.ID_Generated = cte.RowNumber
    from tablename t
    inner join cte on t.ID = cte.ID
    

    【讨论】:

      【解决方案3】:

      我想你想要:

      select ID, companyName,
             (case when row_number() over (partition by id order by companyname) = 1
                   then cast(id as varchar(255))
                   else id || '_'  || row_number() over (partition by id order by companyname)
              end) as new_id
      from test;
      

      || 是 SQL 中的 ANSI/ISO 标准连接运算符。并非所有数据库都支持它,因此您可能需要将运算符替换为适合您数据库的运算符。

      【讨论】:

        猜你喜欢
        • 2019-01-23
        • 2021-12-07
        • 2023-03-27
        • 2018-06-08
        • 2012-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多