Published on

October 6, 2020

Tratando Registros Duplicados no SQL Server

Você já encontrou registros duplicados no seu banco de dados SQL Server? Registros duplicados podem causar problemas de precisão de dados e impactar a conformidade. Neste artigo, discutiremos as razões por trás dos registros duplicados e exploraremos maneiras de lidar e removê-los.

Razões para Registros Duplicados

Há duas principais razões para a duplicidade de dados:

  1. Falta de validação em um aplicativo: Registros duplicados podem ser criados quando um usuário envia acidentalmente um formulário da web várias vezes ou abre várias instâncias de uma página da web.
  2. Design de banco de dados inadequado: Registros duplicados também podem ocorrer devido a um design de banco de dados inadequado, onde o banco de dados não possui restrições adequadas.

Encontrando Registros Duplicados

Para identificar e analisar registros duplicados, podemos usar consultas SQL. Vamos considerar um cenário em que temos uma tabela sem uma restrição de chave primária ou única. Podemos usar as seguintes consultas para criar um banco de dados fictício, criar uma tabela e inserir alguns valores:

Criar Banco de Dados Conformidade;
Ir;

criar tabela BusinessUnit_specific_Compliance
(
Compliance_ID varchar(50),
Business_Unit_Name varchar(50),
Submitted_By varchar(50),
Compliance_Status varchar(50),
Time_Stamp DateTime
)

Inserir em BusinessUnit_specific_Compliance valores ('1001','Malden', 'sp\Luke', 'Concluído',getdate())
Inserir em BusinessUnit_specific_Compliance valores ('1001','Malden', 'sp\Luke', 'Concluído',getdate())
Inserir em BusinessUnit_specific_Compliance valores ('1002','Cambridge', 'sp\Jane', 'Concluído',getdate())
Inserir em BusinessUnit_specific_Compliance valores ('1003','Everet', 'sp\Liam', 'Pendente',getdate())
Inserir em BusinessUnit_specific_Compliance valores ('1002','Cambridge', 'sp\Jane', 'Concluído',getdate())
Inserir em BusinessUnit_specific_Compliance valores ('1002','Cambridge', 'sp\Jane', 'Concluído',getdate())

Se verificarmos a tabela, veremos que registros duplicados foram enviados pelo mesmo usuário com o mesmo status.

Usando Agrupamento para Encontrar Registros Duplicados

Para encontrar registros duplicados, podemos usar as cláusulas GROUP BY e HAVING no SQL. A seguinte instrução SELECT demonstra isso:

SELECT
       A.compliance_id
     , Business_Unit_Name
     , Submitted_By
     , COUNT(*) AS Duplicate_Occurence
FROM   BusinessUnit_specific_Compliance A
WHERE
       compliance_id          = compliance_id
       AND Business_Unit_Name = Business_Unit_Name
       AND Submitted_By       = Submitted_By
GROUP BY
       compliance_id, Business_Unit_Name, Submitted_By
HAVING COUNT(compliance_id) > 1;

Esta consulta retornará os registros duplicados juntamente com a contagem de ocorrências. Analisando os resultados, podemos identificar os grupos duplicados.

Usando a Função Row_Number() para Encontrar Linhas Duplicadas

A função Row_Number() pode ser usada para atribuir um número de linha único a cada linha em uma tabela. Ao particionar as linhas com base em colunas específicas, podemos identificar linhas duplicadas. Aqui está um exemplo:

SELECT [Compliance_ID], 
       [Business_Unit_Name], 
       [Submitted_By], 
       ROW_NUMBER() OVER(PARTITION BY [Compliance_ID], 
                                      [Business_Unit_Name], 
                                      [Submitted_By]
       ORDER BY [Compliance_ID]) AS Duplicate_Occurence
FROM [dbo].[BusinessUnit_specific_Compliance]

Esta consulta retornará as linhas duplicadas com um número de linha diferente atribuído a cada ocorrência duplicada.

Excluindo Registros Duplicados

Para remover registros duplicados de uma tabela do SQL Server, podemos usar uma Expressão de Tabela Comum (CTE) combinada com a função Row_Number(). Ao excluir registros em que o Duplicate_Occurence é maior que 1, podemos limpar as linhas duplicadas. Aqui está um exemplo:

WITH CTE([Compliance_ID], 
    [Business_Unit_Name], 
    [Submitted_By], 
    Duplicate_Occurence)
AS (SELECT [Compliance_ID], 
           [Business_Unit_Name], 
           [Submitted_By], 
           ROW_NUMBER() OVER(PARTITION BY [Compliance_ID], 
                                          [Business_Unit_Name], 
                                          [Submitted_By]
           ORDER BY [Compliance_ID]) AS Duplicate_Occurence
    FROM [dbo].[BusinessUnit_specific_Compliance])
DELETE FROM CTE
WHERE Duplicate_Occurence > 1;

Após executar esta consulta, a tabela conterá apenas linhas únicas.

Conclusão

A limpeza de registros duplicados de um banco de dados SQL Server pode ser uma tarefa demorada, mas é essencial para a precisão dos dados e conformidade. Usando técnicas como ROW_NUMBER() e CTE, podemos identificar e remover registros duplicados de forma eficaz. No entanto, é importante testar e verificar o código em um ambiente não produtivo antes de implementá-lo em um sistema ao vivo.

Obrigado por ler este artigo. Esperamos que você tenha achado útil para lidar com registros duplicados no SQL Server.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.