Найти дубликат идентификатора и добавить новый идентификатор последовательности - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть таблица, в которой ID должен быть уникальным. Есть некоторые идентификаторы, которые не являются уникальными. Как мне сгенерировать новый столбец, который добавляет последовательность к этому идентификатору? Я хочу сгенерировать ID_new_generated в таблице ниже

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

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Вы можете использовать оконную функцию (например, ранг) для генерации вторичного идентификатора над каждым окном, определенным строками, имеющими одинаковый идентификационный номер, а затем просто объединить его для создания нового.

что-токак:

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 выиспользование.

0 голосов
/ 16 ноября 2018

Я думаю, вы хотите:

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;

|| - это стандартный оператор конкатенации ANSI / ISO в SQL.Не все базы данных поддерживают его, поэтому вам может потребоваться заменить оператора на оператор, подходящий для вашей базы данных.

0 голосов
/ 16 ноября 2018

Предполагается, что вы ищете решение в SQL Server:

Сначала вам нужно добавить обнуляемый столбец ID_Generated, как показано ниже:

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

Затем используйте row_number, как показано ниже вСтруктура cte (вы можете использовать временную таблицу, если вы используете 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
...