Ir para conteúdo
Fórum Script Brasil
  • 0

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


cezarhlima

Pergunta

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 para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 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;*.

Editado por Kakao
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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.

Editado por Kakao
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...