none
Tratar registros SEMI-DUPLICADOS no SQL Server 2008 R2 RRS feed

  • Pergunta

  • Bom dia pessoal, estou participando de uma migração de base de dados, e é necessário tratar os dados cadastrais dos Clientes ( eliminar duplicações,  retirar sinais ortográficos, etc....).

    Fiz essa query para ver se haviam duplicações:

    SELECT NOME, COUNT(*) AS QTD_DUPLIC
      FROM MIGRAR
     GROUP BY NOME
    HAVING COUNT(*) > 2
     ORDER BY COUNT(*) DESC
    

    O maior problema que encontrei foram com os registros SEMI-DUPLICADOS, como esse por exemplo:

    Fazendo um select no registro LEONIL NUNES DO PRADO JUNIOR eu tenho como retorno:

    O problema dessa tabela é que a mesma pessoa foi inserida mais de uma vez, (por algum funcionário sem noção da empresa...) para piorar mais ainda as coisas, nos outros registros o endereço está em uma row, o numero em outra, o estado civil em outra e por assim em diante...

    MINHA DÚVIDA É:

    Eu queria sabe se é possivel criar uma função onde de acordo com o nome da pessoa, eu posso fazer um select nos outros campos da tabela e inserir em uma ROW unica reunindo todas as informações da pessoa em questao, eliminando assim as outras redundantes ???

     

    Eu consegui eliminar os registros duplicados através das funções de rank:

    CREATE VIEW V1_ELIMINA_DUPLICADO
    AS
    SELECT *,ROW_NUMBER() OVER (PARTITION BY NOME ORDER BY NOME) RNK FROM MIGRAR
    
    DELETE FROM V1_ELIMINA_DUPLICADO WHERE RNK > 1
    

    Mas foram preservados apenas os primeiros registros da pessoa em questao, as informações como endereço, grau de instrução foram perdidas.....

     

    Me indicaram a fazer um DEPARA, mas não sei como isso funciona, alguém poderia me ajudar com isso?

    Agradeço a ajuda de todos

    sexta-feira, 11 de novembro de 2011 14:05

Respostas

  • Olá Khallew, trabalho com higienização de banco de dados a anos e sem exatamente o problema que é inserir um dado duplicado que na verdade é diferente, por causa da fonética.

    Existem várias ferramentas de data cleasing no mercado que consegue eliminar estas duplicidades com facilidade, mas acredito que não seja seu caso contratar uma consultoria apenas para higienizar a base.

    O que vc pode fazer é realizar um select deduplicando estas informações. Para tal, vc precisa definir algumas chave para deduplicação. Trabalhar apenas com o nome como deduplicação é periogoso por causa dos honônimos (nomes iguais). Talvez vc teria que pegar o nome mais uma cidade, uf e  o numero da casa.

    Tente executar este select:

    select * INTO MIGRAR_DEDUP from MIGRAR a where a.CODIGO IN (
      SELECT TOP 1 B.CODIGO FROM MIGRAR B
       WHERE a.NOME = B.NOME AND A.CIDADE = B.CIDADE AND A.UF = B.UF
         AND A.NUMERO = B.NUMERO)

    Enfatizando que o campo CODIGO não pode ter duplicidade senão esse select nao funciona.

    Abs.

    sexta-feira, 11 de novembro de 2011 14:49
  • Olá Khallew,

    Talvez para resolver teu problema, tu possa fazer o seguinte, veja se isso ajudaria no teu problema:

     

    1º seleciona DISTINCT de todas as pessoas na tabela FUNCIONARIOS e grava na TEMP

    2º faz um cursor para varrer FUNCIONARIOS e atualizar na tabela TEMP os demais campos, somente se estiverem NULL.

    Desta forma, tu vai atualizar no funcionário X todos os campos com pelo menos um valor daqueles que tu possui na tabela.

     

    Se precisar de detalhes com mais tempo eu monto pra ti um modelo, se te ajudar isso, senão manda ai que procuramos outra alternativa.

    Vlew.

    quarta-feira, 16 de novembro de 2011 18:49

Todas as Respostas

  • Olá Khallew, trabalho com higienização de banco de dados a anos e sem exatamente o problema que é inserir um dado duplicado que na verdade é diferente, por causa da fonética.

    Existem várias ferramentas de data cleasing no mercado que consegue eliminar estas duplicidades com facilidade, mas acredito que não seja seu caso contratar uma consultoria apenas para higienizar a base.

    O que vc pode fazer é realizar um select deduplicando estas informações. Para tal, vc precisa definir algumas chave para deduplicação. Trabalhar apenas com o nome como deduplicação é periogoso por causa dos honônimos (nomes iguais). Talvez vc teria que pegar o nome mais uma cidade, uf e  o numero da casa.

    Tente executar este select:

    select * INTO MIGRAR_DEDUP from MIGRAR a where a.CODIGO IN (
      SELECT TOP 1 B.CODIGO FROM MIGRAR B
       WHERE a.NOME = B.NOME AND A.CIDADE = B.CIDADE AND A.UF = B.UF
         AND A.NUMERO = B.NUMERO)

    Enfatizando que o campo CODIGO não pode ter duplicidade senão esse select nao funciona.

    Abs.

    sexta-feira, 11 de novembro de 2011 14:49
  • Olá edugp_sp muito obrigado pela resposta, eu teste sua query em uma base de testes e realmente ela elimina a duplicação, mas ela nao me atende nesse caso especifico de preservar as informações das rows duplicadas e inserir na row original ( ou em uma nova row em outra tabela com outro código) 

    eu fiz esse exemplo pra testes:

    CREATE TABLE DUPLICADOS
    (
    MAT INT IDENTITY(1,1),
    NOME VARCHAR(20),
    CPF VARCHAR(11),
    SEXO CHAR(1),
    )
    
    INSERT INTO DUPLICADOS VALUES ('KHALLEW','','')
    INSERT INTO DUPLICADOS VALUES ('KHALLEW','11111111111','')
    INSERT INTO DUPLICADOS VALUES ('KHALLEW','','M')
    INSERT INTO DUPLICADOS VALUES ('KHALLEW','11111111111','')
    INSERT INTO DUPLICADOS VALUES ('KHALLEW','','M')
    INSERT INTO DUPLICADOS VALUES ('BRUNA','','')
    INSERT INTO DUPLICADOS VALUES ('BRUNA','22222222222','')
    INSERT INTO DUPLICADOS VALUES ('BRUNA','','F')
    INSERT INTO DUPLICADOS VALUES ('BRUNA','22222222222','')
    INSERT INTO DUPLICADOS VALUES ('BRUNA','','F')
    

    ai ele retornou isso:

     

    eu queria que ela ficasse como esse segundo SELECT acima 

    sexta-feira, 11 de novembro de 2011 16:40
  • Então Khallew, aí fica realmente complicado fazer esta deduplicação por select. Não como o quanto é confidencial esta informação, mas se quiser me mandar os registros num arquivo texto posso tentar te ajudar a deduplicar os dados.

    Abs.

    sexta-feira, 11 de novembro de 2011 17:06
  • eu queria enviar, mas é um projeto fechado e de curto prazo, se eu achar a solução eu posto aki ?

    mas muito obrigado pela ajuda.

    sexta-feira, 11 de novembro de 2011 17:10
  • Olá Khallew,

    Talvez para resolver teu problema, tu possa fazer o seguinte, veja se isso ajudaria no teu problema:

     

    1º seleciona DISTINCT de todas as pessoas na tabela FUNCIONARIOS e grava na TEMP

    2º faz um cursor para varrer FUNCIONARIOS e atualizar na tabela TEMP os demais campos, somente se estiverem NULL.

    Desta forma, tu vai atualizar no funcionário X todos os campos com pelo menos um valor daqueles que tu possui na tabela.

     

    Se precisar de detalhes com mais tempo eu monto pra ti um modelo, se te ajudar isso, senão manda ai que procuramos outra alternativa.

    Vlew.

    quarta-feira, 16 de novembro de 2011 18:49
  • Gostaria de agradecer a todos os que me forneceram ajuda para resolver esse problema,  peço desculpas pela demora em responder se deu certo a migração ou não.

    como a complexidade desse problema era grande (para o cliente) ficou acordado que ele teria que resolver essa pendência no banco de dados com a equipe de TI dele, para então realizar a migração.

    Mais uma vez obrigado pelas dicas

    segunda-feira, 28 de novembro de 2011 12:32
  • Kallew

    Se puder e achar justo, marque a thread que o ajudou, esta ação poderá ajudar outros usuarios do forum com a mesma duvida.

     


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    segunda-feira, 28 de novembro de 2011 13:24