Как обновить / увеличить столбец с уникальным идентификатором на основе столбца ссылки - PullRequest
0 голосов
/ 16 января 2020

есть таблица с некоторыми ссылками и датами. Я хотел бы назначить уникальный идентификатор в другом столбце для каждой группы ссылок. Я использую Sybase ASE 15.7

Образцы данных ниже Повторяющиеся ссылки с уникальными датами. Я хотел бы добавить уникальный идентификатор в другой столбец для каждой ССЫЛКИ.

REFERENCE   DATES
123 01/01/2020
123 01/02/2020
123 01/03/2020
123 01/04/2020
456 01/01/2020
456 01/02/2020
456 01/03/2020
789 01/01/2020
789 01/02/2020
789 01/03/2020
789 01/04/2020
789 01/05/2020

Что бы я хотел видеть.

Results with UID column added

I ' мы смогли обновить весь столбец с инкрементным значением, но не можем понять, как выполнить l oop по каждой ссылке. Мне не удалось найти примеры подобных проблем, которые были бы совместимы с ASE. Спасибо

Ответы [ 2 ]

1 голос
/ 17 января 2020

Настройка:

create table refs
(reference      int
,dates          date
,uid            varchar(10)     NULL
)
go

set nocount on
go

insert refs (reference,dates) values (123,'01/01/2020')
insert refs (reference,dates) values (123,'01/02/2020')
insert refs (reference,dates) values (123,'01/03/2020')
insert refs (reference,dates) values (123,'01/04/2020')

insert refs (reference,dates) values (456,'01/01/2020')
insert refs (reference,dates) values (456,'01/02/2020')
insert refs (reference,dates) values (456,'01/03/2020')

insert refs (reference,dates) values (789,'01/01/2020')
insert refs (reference,dates) values (789,'01/02/2020')
insert refs (reference,dates) values (789,'01/03/2020')
insert refs (reference,dates) values (789,'01/04/2020')
insert refs (reference,dates) values (789,'01/05/2020')
go

Обновление:

Уникальная / цифра c часть идентификатора пользователя определяется путем поиска счетчик количества строк с тем же значением references и dates меньше, чем столбец dates текущей строки, а затем +1 для нашего окончательного значения:

update refs
set    uid =    convert(varchar(10),reference) + '_' +
                convert(varchar(10), (select    count(*) + 1
                                        from    refs r2
                                        where   r2.reference = r1.reference
                                        and     r2.dates     < r1.dates)
                       )
from   refs r1
go

Результаты:

select reference,convert(varchar(10),dates,101) as dates, uid
from   refs
order by reference,dates
go

 reference   dates      uid
 ----------- ---------- ----------
         123 01/01/2020 123_1
         123 01/02/2020 123_2
         123 01/03/2020 123_3
         123 01/04/2020 123_4
         456 01/01/2020 456_1
         456 01/02/2020 456_2
         456 01/03/2020 456_3
         789 01/01/2020 789_1
         789 01/02/2020 789_2
         789 01/03/2020 789_3
         789 01/04/2020 789_4
         789 01/05/2020 789_5

Выше было проверено на ASE 15.7 SP138.

0 голосов
/ 16 января 2020

Вы можете использовать row_number():

select t.*,
       (reference + '_' + row_number() over (partition by reference order by date)) as uid
from t;
...