MySQL преобразовать повторяющиеся записи поля в дублирующее инкрементное значение - PullRequest
1 голос
/ 02 апреля 2020

В настоящее время у меня есть таблица с полем parent_id для нескольких записей, ie один и тот же идентификационный номер для 4 записей (согласно скриншоту ниже). Я хотел бы преобразовать parent_id для запуска с 9000 и выше, поэтому на скриншоте 000004 станет 9000 в 4 записях, 000007 станет 9001 в 4 записях и так далее (как показано в примере результата). Кто-нибудь знает простой способ реализовать это, пожалуйста, поскольку я бы предпочел не менять вручную 2224 записи!?

Заранее спасибо, ребята!

Снимок экрана таблицы:

table screenshot

Пример результата:

example outcome

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Вы, кажется, хотите update. Если это так:

update t join
       (select t.*, row_number() over (order by id) as seqnum
        from t
       ) tt
       on t.id = tt.id
    set t.parent_id = 9000 + floor( (seqnum - 1) / 4);

Обратите внимание, что при этом игнорируется текущее значение parent_id, которое присваивает то же значение группам из 4 строк на основе id.

EDIT:

В старых версиях MySQL:

update t join
       (select t.*, (@rn := @rn + 1) as seqnum
        from (select t.* from t order by id) t cross join
             (select @rn := 0) params
       ) tt
       on t.id = tt.id
    set t.parent_id = 9000 + floor( (seqnum - 1) / 4);
0 голосов
/ 02 апреля 2020

Если вы работаете MySQL 8.0, вы можете использовать dense_rank() для этого:

select
    t.*,
    8999 + dense_rank() over(order by parent_id) new_parent_id
from mytable t

В более ранних версиях один (менее эффективный) вариант использует коррелированный подзапрос:

select
    t.*,
    9000 + (select count(distinct t1.parent_i) from mytable t1 where t1.parent_id < t.parent_id) new_parent_id
from mytable t
...