Jump to content
Fórum Script Brasil
  • 0

Reordenar sequência de códigos que estão duplicados


cezarhlima

Question

Eu tenho um campo codigo do tipo text, entre estes codigos existem alguns duplicados, exemplo tenho 500 codigos 50 estão duplicados, tenho um campo grid que incrementa mais um a cada inserção, como faço para reordenar o código desses 50 duplicados, no caso reordenando apenas o código do que estiver com o maior grid, o que estiver com o menor grid continuará como está, neste caso no final terei que ter 550 codigos.

Obrigado.

Link to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 0

with dup as (
    select codigo, max(grid) grid
    from ts
    group by codigo
    having count(*) > 1
), m as (
    select max(cast(codigo as integer)) m from ts
)
update ts
set codigo = i
from (
    select codigo, grid,
        row_number() over(order by grid) + (select m from m) i
    from dup
) s
where
    ts.codigo = s.codigo
    and
    ts.grid = s.grid

Este update supõe que só existem duplicados e não triplicados ou mais. Se existirem é só repetir o update até não existir mais nenhum duplicado.

Para não correr risco (mesmo se houver backup) é melhor dar um *begin;* antes do comando e aí conferir o resultado. Se deu certo dá um *commit;*. Se não deu faz um *rollback;*.

Edited by Kakao
Link to comment
Share on other sites

  • 0
with dup as (
    select codigo, max(grid) grid
    from ts
    group by codigo
    having count(*) > 1
), m as (
    select max(cast(codigo as integer)) m from ts
)
update ts
set codigo = i
from (
    select codigo, grid,
        row_number() over(order by grid) + (select m from m) i
    from dup
) s
where
    ts.codigo = s.codigo
    and
    ts.grid = s.grid

Este update supõe que só existem duplicados e não triplicados ou mais. Se existirem é só repetir o update até não existir mais nenhum duplicado.

Para não correr risco (mesmo se houver backup) é melhor dar um *begin;* antes do comando e aí conferir o resultado. Se deu certo dá um *commit;*. Se não deu faz um *rollback;*.

Este comando não rodou no meu banco 8.2, na versão 9.1 rodou normalmente, existe alguma forma de fazer este mesmo procedimento na versão 8.2?

Obrigado.

Link to comment
Share on other sites

  • 0

No 8.2 tem que usar sequência:

begin;
drop sequence if exists s;
create temporary sequence s;
select setval('s', (select max(cast(codigo as integer)) m from ts));

update ts
set codigo = i
from (
    select codigo, grid, nextval('s') i
    from (
        select codigo, max(grid) grid
        from ts
        group by codigo
        having count(*) > 1
        order by grid
    ) q
) s
where
    ts.codigo = s.codigo
    and
    ts.grid = s.grid
;

Se sobrarem duplicados repita só do update para baixo. Depois é só dar rollback ou commit conforme o caso e opcionalmente dar o drop na sequência que é temporária e vai cair de qualquer modo ao fim da sessão. Enquanto não der commit o update não está valendo.

Edited by Kakao
Link to comment
Share on other sites

  • 0
No 8.2 tem que usar sequência:

begin;
drop sequence if exists s;
create temporary sequence s;
select setval('s', (select max(cast(codigo as integer)) m from ts));

update ts
set codigo = i
from (
    select codigo, grid, nextval('s') i
    from (
        select codigo, max(grid) grid
        from ts
        group by codigo
        having count(*) > 1
        order by grid
    ) q
) s
where
    ts.codigo = s.codigo
    and
    ts.grid = s.grid
;

Se sobrarem duplicados repita só do update para baixo. Depois é só dar rollback ou commit conforme o caso e opcionalmente dar o drop na sequência que é temporária e vai cair de qualquer modo ao fim da sessão. Enquanto não der commit o update não está valendo.

Deu certo, muito obrigado novamente.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.5k
×
×
  • Create New...