Lesen Sie unseren Artikel über

class="img-responsive

.

Dateningenieure und Datenanalysten müssen bei ihrer täglichen Arbeit die Dateneingabeprozesse verbessern. Über die üblichen Unit-Tests hinaus kann es interessant sein, zwei Datensätze (d. h. Tabellen, Ansichten, Abfragen usw.) für verschiedene Zwecke wie Auswirkungsanalysen oder Nicht-Regressionstests einfach und schnell zu vergleichen. Auch die Identifizierung von Diskrepanzen zwischen zwei Standpunkten einer Snapshot-Tabelle ist für Ad-hoc-Analysen oder die Fehlersuche sehr nützlich.

Vor diesem Hintergrund und für SQL-Praktiker ist ein vorgefertigtes und wiederverwendbares Skript sinnvoll, daher der Zweck dieses Artikels.

Gebrauchsfertige SQL-Vorlage erklärt

Lassen Sie uns mit der erwarteten Anfrage zum Kern der Sache vordringen:

Lassen Sie uns das erklären:

  • Zunächst verwenden wir CTE - Common Table Expressions (WITH ... ASstatements), um die beiden zu vergleichenden Datensätze zu identifizieren. Dadurch können die folgenden Abfragezeilen unverändert bleiben.

  • Dann konstruieren wir zwei ähnliche Abfragen mit den Aliasen dataset_1_only und dataset_2_only, um Zeilen zu behalten, die nur in dataset 1 vorhanden sind (im Vergleich zu dataset 2) und umgekehrt dank des EXCEPT-Set-Operators.

  • Schließlich wird ein Flaggenergänzungsfeld definiert, um die Quelle der nicht übereinstimmenden Zeilen aus beiden Abfragen zu identifizieren. Diese werden dann über den Operator UNION ALL gesammelt.

Hinweis: Voraussetzung für die Verwendung der obigen Abfrage ist natürlich, dass zwei Datensätze mit vergleichbaren Feldern vorhanden sind.

Illustriertes Beispiel

Genug der Theorie, jetzt zur Praxis! Angenommen, ein Supermarkt möchte alle Produkte, die für eine Werbeaktion in Frage kommen, in einer einzigen Tabelle nach den Bedingungen der Woche abrufen.

Als erste Aussage betrachten wir die folgenden Produkte auf Lager:

Gemäß den Beförderungsbedingungen in Woche 1:

  • 10% Rabatt auf Obst, Gemüse und Kräuterregale

der Datensatz_1 ist:

In Woche 2 ändern sich die Beförderungsbedingungen zu:

  • 10% Ermäßigung auf Obst- und Eiscreme-Regale

  • 20% Rabatt auf das Gemüseregal

  • kein Rabatt im Kräuterregal

Die data pipeline evolution erzeugt den Datensatz_2:

Aber... sind wir wirklich von den Ergebnissen überzeugt? Typische Fragen sind:

  • Gibt es fehlende oder zusätzliche Zeilen?

  • Sind die durchgeführten Entwicklungen auf den betroffenen Feldern korrekt?

  • Gibt es eine Regression auf nicht betroffenen Feldern?

Hinweis: Auch wenn es aufgrund eines trivialen Beispiels für einen kleinen Datensatz einfach erscheint, die obigen Fragen intuitiv zu beantworten, haben wir es in realen Anwendungsfällen in der Regel mit vielen Zeilen und Spalten aus komplexen Abfragen zu tun (Transformationen, Joins, Aggregate, Windows-Funktionen, ...), so dass diese Abfrage ihre volle Bedeutung erlangt

Versuchen wir nun, die 3 Fragen zu beantworten, indem wir die Ergebnisse der Vergleichsabfrage interpretieren:

Beobachtungen:

  • Keine Reihe mit Produkten aus dem Obstregal: gut, denn der "10% Rabatt auf Obst" ist von Woche 1 zu Woche 2 unverändert geblieben

  • Produkt_ID #50 (Kräuterregal) fehlt in Datensatz_2 (nur in Datensatz_1): in Ordnung, da der "Rabatt auf Kräuter" in Woche 2 eingestellt wurde

  • Product_ID #60 (Eiscreme-Regal) fehlt in Datensatz_1 (nur in Datensatz_2): in Ordnung, da der "Rabatt auf Eiscreme" in Woche 2 eingeführt wurde

  • Die Zeilen, die die Product_ID #30 und #40 (Gemüseregal) betreffen, weichen im Feld reduced_price voneinander ab: gut, da der "Rabatt auf Gemüse" von 10% in Woche 1 auf 20% in Woche 2 gestiegen ist

Endlich sieht alles gut aus:

  • Gibt es fehlende oder zusätzliche Zeilen? Nein!

  • Sind die durchgeführten Entwicklungen auf den betroffenen Feldern korrekt? Ja!

  • Gibt es eine Regression auf nicht betroffenen Feldern? Nein!

Tipps und Tricks

Auch wenn Sie bei CTE Ihre Ingestion-SQL-Abfrage vor/nach der Entwicklung einfügen können, könnte es eine gute Idee sein, die Ergebnisse in temporären Tabellen zu speichern, um den Vergleich zu vereinfachen, die Abfrageleistung zu verbessern und von der Zwischenspeicherung zu profitieren, wenn Sie die Abfrage mehrmals ausführen.

In der Praxis können Abweichungen zwischen zwei Datensätzen unschön sein. Dann kann die Sortierung der Ergebnisse nach Schlüssel (der Granularität der Datensätze) und Flagge die Interpretation und den Vergleich gleichwertiger Zeilen aus beiden Datensätzen enorm erleichtern.

Um die Untersuchungen zu erleichtern und den Ursprung der Lücke zu ermitteln, können die verdächtigen gemeinsamen Felder des Datensatzes aus dem Vergleich entfernt (d. h. in CTE kommentiert) werden: Wenn es kein Ergebnis gibt, bedeutet dies, dass alle verglichenen Felder gleich sind. Sie können sich dann beim nächsten Vergleich nur auf die verbleibenden verdächtigen Felder konzentrieren und Schritt für Schritt vorgehen.

Hinweis: Eine gleichwertige Analyse hätte mit der Strategie LEFT JOIN durchgeführt werden können, wäre aber viel schwieriger zu pflegen (Verwaltung von NULLs und Feldvergleichen) und weniger effizient gewesen, da Mengenoperatoren leistungsfähiger sind als Joins.

Zusammenfassung

Diese Abfragevorlage erleichtert es den Entwicklern daher, Änderungen an komplexen data Pipelines schnell zu validieren. Sie ist eine nützliche Ergänzung zu traditionelleren Unit-Tests und kann sogar ganz allgemein für den Vergleich zweier Datensätze mit ähnlichen Strukturen herangezogen werden. Und nicht zuletzt ist die Logik dieser Abfrage sogar leicht auswendig zu lernen!

Danke fürs Lesen, ich hoffe, es war klar und ich würde mich über Ihr Feedback freuen :)

class="img-responsive

Medium Blog von Artefact.

Dieser Artikel wurde ursprünglich auf Medium.com veröffentlicht.
Folgen Sie uns auf unserem Medium Blog!