Umgang mit doppelten Einträgen in SQL Server

cover image of blog article 'Umgang mit doppelten Einträgen in SQL Server'

In diesem Artikel gehen wir mit einem Drei-Stufen Plan auf das Problem von Duplikaten in SQL Server Datenbanken ein und zeigen Ihnen mit einfachen Handgriffen, wie Sie in der Problemlösung vorgehen. Duplikate sind ein immer wiederkehrendes Problem für jeden Datenbankbenutzer. Es gibt mehrere Gründe, warum Duplikate in einem Datensatz erscheinen können. In den allermeisten Fällen ist eine Plausibilitätsprüfung erforderlich, bevor eine Analyse ordnungsgemäß durchgeführt werden kann. Wir zeigen Ihnen nachfolgend einige Szenarien, die auftreten können.

Szenario:
Sie haben ein vermeidlich sehr erfolgreiches Jahr hinter Ihnen. Die Intuition bestätigt sich durch eine durchgeführte Analyse der Anzahl der Neukundengewinne. Sie sehen in der entsprechenden Auswertung, dass sich die Anzahl der Neukunden um ein vielfaches vermehrt hat. Sie trauen Ihren Augen nicht und stellen eine erneute Untersuchung der Zahlen an, um auch wirklich sicher zu sein. Das Ergebnis ist nun etwas ernüchternd, denn Sie bemerken, dass einige Daten doppelt gezählt wurden. Somit ist das Ergebnis natürlich verfälscht und spiegelt nicht den richtigen unternehmerischen Erfolg wieder.

Offensichtlich sind einige Duplikate in Ihrer SQL Server Datenbank vorhanden, die nun identifiziert werden sollten um sie anschließend zu entfernen und auch langfristig zu vermeiden.

customer_first_name customer_last_name email_address date_of_birth
Robert Schmidt r.schmidt@email.de 1978-06-06
Robert Schmidt r.schmidt@email.de 1978-06-06
Rita Schmidt riiiiita.schmidt@email.de 1957-10-05
Heidi Schmidt heidi.schmidt@email.de 1965-04-11
... ... ... ...

Schritt 1: SQL Server Duplikate identifizieren

Es gibt verschiedene Optionen, wie sich Duplikate in Ihre Tabelle eingeschlichen haben können. Der erste Schritt besteht darin, eventuelle Duplikate in Ihrer Datenbanktabelle zu identifizieren. Mit nachfolgender SQL Abfrage können Sie alle vorhandenen Duplikate sichtbar machen. Sie sollten sich jedoch zuvor anhand einiger Beispiele die Erkennungsmerkmale von doppelten Zeilen näher bringen. Sie entwickeln dann ein Auge für Duplikate und können sie so noch schneller identifizieren und auch verstehen.

Basierend auf unserer Beispieltabelle weiter oben, starten wir mit folgender SQL Abfrage, um eventuelle Duplikate sichtbar machen. Um wirklich sicher zu sein, verwenden wir die Emailadresse und das Geburtsdatum der Kunden.

SELECT
  c.*
FROM customers AS c
INNER JOIN
(
  SELECT
    email_address,
    date_of_birth,
    COUNT(*)
  FROM customers
  GROUP BY email_address, date_of_birth
  HAVING COUNT(*) >= 2
) AS d
ON c.email_address = d.email_address AND c.date_of_birth = d.date_of_birth
ORDER BY c.email_address

Um die Abfrage auf eine beliebige Datentabelle anzuwenden, müssen folgende Fehler ersetzt werden:

  • Customer sollte durch die Datentabelle ersetzt werden, in der Sie nach möglichen Duplikaten suchen.
  • email_address und date_of_birth sollte durch alle Felder ersetzt werden, die für jede Einheit in Ihrer Datentabelle eindeutig sein sollte.

Ist das Ergebnis eine leere Tabelle, sind anhand Ihrer angegebenen Kriterien keine Duplikate in der Datentabelle vorhanden. Erhalten Sie eine Ausgabe mit doppelten Zeilen, sollten Sie diese nachgehend näher untersuchen. Hier helfen Ihnen die Spalten, die eventuell nicht ganz eindeutig sind. Dafür könnte man sich die Spalten customer_first_name und customer_last_name einmal anschauen. In unserem Beispiel können wir erkennen, dass der Kunde “Robert Schmidt” doppelt zu finden ist.

Schritt 2: So vermeiden Sie Duplikate

Wie so oft ist Vorsorge das beste Heilmittel vor allen Krankheiten. Bevor Sie die Duplikate aus Ihren Tabellen blind entfernen, ist es wichtig zu verstehen, warum die Duplikate überhaupt erst entstanden sind. Mögliche Ursachen können betrieblich (Verkäufer hat den Kunden mehrfach registriert), technisch (IT-Bug) oder im Zusammenhang mit Datenmanipulation (zwischen geschaltete Datentabelle) entstanden sein. Die vorherige Ursachenidentifikation hilft Ihnen dabei, das Problem dann auf der richtigen Ebene anzugehen. Ist das Problem technischer oder betrieblicher Herkunft, können Sie beispielsweise die zuständige Abteilung zu Rate ziehen und alles Inhouse beheben lassen. Ist das Problem an eine Datenmanipulation geknüpft, gibt es unterschiedliche Herangehensweisen, um dieses zu beheben. Sie sollten jedoch immer darauf achten, dass sie die beste Strukturierung Ihres SQL Codes anstreben, um Duplikate zu vermeiden. Dabei helfen beispielsweise Datenmodelle und Visualisierungen, die bereits im Vorhinein Klarheit und Struktur in Ihre Abfrageausgaben liefern.

Schritt 3: So entfernen Sie Duplikate

Nach der Identifikation der Duplikate und dem Erörtern des Problemhergangs, möchten wir nun die gefundenen Duplikate aus der Ausgabe entfernen. Nur damit stellen Sie eine valide Analyse und aussagekräftige Ergebnisse sicher.

Dafür gibt es verschiedene Techniken, die Sie verwenden können. Wir konzentrieren uns heute auf 3 davon.

  1. Die gut strukturierte Liste mit WITH

In der gut strukturierten Liste möchten wir die eindeutigen Fehler der Abfrage sichtbar machen. Dafür verwenden wir die WITH Klausel und folgenden Abfragecode:

WITH list AS
(
  SELECT
    DISTINCT email_address,
    date_of_birth
  FROM customers
)

SELECT
  list.email_address,
  list.date_of_birth,
  c.customer_first_name,
  c.customer_last_name
FROM list
LEFT JOIN customers AS c
ON c.email_address = list.email_address AND c.date_of_birth = list.date_of_birth
  1. Die unique Identifier Technik mit PARTITION_BY

Mit dieser Technik verwenden wir eine FIRST_VALUE in Kombination mit der PARTITION_BY Klausel. Für die anfänglich definierten Felder “email_address” und “date_of_birth” nehmen diese Funktionen den ersten Wert des Feldes “customer_first_name” in der Datentabelle.

SELECT
  DISTINCT email_address,
  date_of_birth,
  FIRST_VALUE(customer_first_name) OVER (PARTITION BY email_address, date_of_birth)
    AS customer_first_name,
  FIRST_VALUE(customer_last_name) OVER (PARTITION BY email_address, date_of_birth)
    AS customer_last_name
FROM customers
  1. Die super schnelle Technik mit GROUP_BY

Ähnlich wie in den vorherigen Techniken, versucht die GROUP_BY Klausel Benutzer zu definieren. Dabei werden Analysen der Werte durchgeführt, die auf kein eindeutiges Feld verweisen. Diese Technik ist besonders hilfreich bei numerischen Feldern. Sie funktioniert jedoch auch bei Zeichenfolgenfeldern.

SELECT
  email_address,
  date_of_birth,
  MAX(customer_first_name) AS customer_first_name,
  MAX(customer_last_name) AS customer_last_name
FROM customers
GROUP BY email_address, date_of_birth

Festzuhalten ist, dass alle drei Techniken zu einem Ergebnis führen - Sie entfernen Duplikate aus einer Datentabelle. Es handelt sich hier um unterschiedlich logische Pfade und SQL Funktionen, die eine andere Herangehensweise je Feld mit sich ziehen.

Fazit

In diesem Kurzartikel sind wir auf verschiedene Probleme hinsichtlich Duplikate in einer SQL Server Abfrage eingegangen. Weiterhin haben wir Tipps zur Problemidentifikation und Problemlösung aufgezeigt, mit denen Sie ganz eigenständig Duplikate aus Ihrer Tabelle entfernen können.

Als SQL Server Spezialisten stehen wir für Fragen rund um diese Themen gerne bereit und helfen Ihnen, die Performance Ihrer SQL Server Abfragen zu optimieren. Kontaktieren Sie uns gerne über unser Kontaktformular, um ein Beratungsgespräch zu vereinbaren.