Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

SQL Para remover itens repetidos

Boa

Tentei porem acho que ainda nao estou em tal nível, queria criar um script para identificar itens repetidos em uma tabela e exclui-los. Deixando apenas um unico registro ex:

Tenho essa tabela:

id - colaborador - os

1 - yago - 100
2 - jose - 200
3 - jose - 200
4 - jose - 200
5 - maria - 300
6 - antonio - 400

O para metro seria a OS. perceba que a os 200 Se repete em três registros cujo id são ( 2,3,4) queria remover dois registros e deixar apenas um. Seria possível criar algo ?

8 respostas

O método mais simples seria usar DISTINCT:

SELECT DISTINCT colaborador, os FROM table

outra forma seria com GROUP BY (nesse exemplo, você ficaria com o primeiro id de cada colaborador)

SELECT max(id) as id, colaborador, max(os) as os FROM table GROUP BY colaborador

Para achar repetições, você pode tentar fazer desta forma:

select colaborador, os, count(*) as repeticoes, max(id) as ultimo_registro
from minha_tabela
group by colaborador, os
having count(*) > 1

Ele vai listar os repetidos, e mostrar o ID do último registro, para você excluir.

Leandro, obrigado pela participação porem um colaborador pode ter mais de uma os... dessa forma sugerida perderia informações

Montei aqui um exemplo pra ti, se tu quiser manter só o ultimo ou só o primeiro, basta modificar a ordenação do menorID. Ao final ele faz um select pela quantidade de registros repetidos e mostra.

DECLARE @nomeColaboradorRepetido varchar(30)= (
SELECT colaborador
FROM funcionarioTeste
GROUP BY colaborador
HAVING ( COUNT(colaborador) > 1 )
)

DECLARE @menorId int = (
SELECT TOP(1) id from funcionarioTeste 
where colaborador = @nomeColaboradorRepetido
)

delete from funcionarioTeste
where colaborador = @nomeColaboradorRepetido
and id > @menorId


DECLARE @quantidadeColaboradorRepetido int= (
SELECT COUNT(colaborador) AS NumOccurrences
FROM funcionarioTeste
GROUP BY colaborador
HAVING ( COUNT(colaborador) > 1 )
)

select @quantidadeColaboradorRepetido as repetidos

select * from funcionarioTeste

Primeiramente muito obrigado , segundo, nunca vi SQL com tal parâmetro , que nível é esse ? Kkk existe aqui no Alura um curso que aborde essas estruturas ?

solução!

Opa, tudo bom Yago?

Então, alguns adendos ao código anterior:

Primeiramente, ele poderia ser executado em uma só consulta, porém, não fica muito legível e seria necessário incluí-los como sub consultas.

Em segundo lugar, ele não possibilita a exclusão caso você tenha mais de um dado que se repete na tabela, no exemplo que você passou ele não funcionaria se além do "João", tivesse o "Yago" também repetido.

Para solver isso, daria-se necessário o uso de loops ou recursividade(lembrando que o SQL só permite 32 vezes a execução recursiva e que só é possível através de Stored Procedures).

Quanto a ultima pergunta, dei uma olhada nos cursos de infraestrutura, aparentemente não vi nada sobre... De qualquer forma, se quiser dar uma pesquisada mais a fundo, esse trecho de código que eu postei é referente ao tópico de "Stored Procedures e Functions em SQL".

Abaixo a procedure funcional de exclusão de valores duplicados, dentro do exemplo postado:

CREATE PROCEDURE [dbo].[DELETAR_FUNCIONARIO_SEM_RECURSIVIDADE] 
as

DECLARE @ExisteColaborador int =
(
SELECT top(1)COUNT(colaborador) AS NumOccurrences
FROM FUNCIONARIOTESTE
GROUP BY colaborador
HAVING ( COUNT(colaborador) > 1 )
)

while @ExisteColaborador > 1 or @ExisteColaborador is not null
begin


SET @ExisteColaborador = 
(
SELECT top(1)COUNT(colaborador) AS NumOccurrences
FROM FUNCIONARIOTESTE
GROUP BY colaborador
HAVING ( COUNT(colaborador) > 1 )
)

DELETE FROM FUNCIONARIOTESTE 
WHERE 
COLABORADOR = (SELECT TOP(1)COLABORADOR 
                 FROM FUNCIONARIOTESTE
             GROUP BY COLABORADOR 
               HAVING (COUNT(COLABORADOR) > 1))
    AND

     ID = (SELECT TOP(1) ID 
             FROM FUNCIONARIOTESTE 
            WHERE COLABORADOR = 
                               (SELECT TOP(1)COLABORADOR 
                                  FROM FUNCIONARIOTESTE 
                              GROUP BY COLABORADOR 
                                HAVING (COUNT(COLABORADOR) > 1))
                                )
end
GO

Ao executar este código, ele irá criar um procedimento armazenado. Depois disso, basta entrar na tua base e executar o comando:

EXEC DELETAR_FUNCIONARIO_SEM_RECURSIVIDADE

Que bacana vey, show de bola. Obrigado !!!

Magina =)