# Analytics-Exporte verknüpfen, ohne Beiträge hinter den Summen zu vervielfachen

Eigene konstruierte Eingaben mit tatsächlich lokal ausgeführten, erklärten Prüfungen. Keine realen Konten, Leser, Kunden, Anbieter-Benchmarks oder allgemeine Sicherheitszertifizierung.

Halte vor der Verknüpfung fest, was eine Zeile in jeder Datei und im Ergebnis bedeutet. Derselbe Schlüssel kann berechtigt mehrere Ergebniszeilen erzeugen. Bewahre Quellsummen und prüfe Mehrfachtreffer, nicht zugeordnete Datensätze und Umfang, bevor du den Bericht berechnest. Eine vertraute Engagement-Rate kann trotz falscher verknüpfter Summen unverändert bleiben.

## Vor dem Schlüssel beide Zeileneinheiten festlegen

Eine Datei enthält zum Beispiel je Beitrag eine Beobachtung nach 24 Stunden, eine andere redaktionelle Themen-Tags. Ein Beitrag kann mehrere Tags haben; die zweite Datei hat also je Beitrags-Tag-Paar eine Zeile. Die Verknüpfung liefert eine hilfreiche Tag-Ansicht, ändert aber die Zeileneinheit. Beschrifte das Ergebnis mit „ein Beitrags-Tag-Treffer und gegebenenfalls ein erhaltener Beitrag ohne Treffer“, statt jede Zeile weiterhin Beitrag zu nennen.

Prüfe für beide Dateien Konto, Beobachtungszeitraum, Beobachtungsalter und Feldbedeutung. Ein genauer Beitragsschlüssel innerhalb eines Exports erlaubt weder das Mischen fremder Konten noch aktueller Lebenszeitwerte mit früheren 24-Stunden-Werten. Benötigt die Einheit mehrere Felder, erkläre den zusammengesetzten Schlüssel. Fehlender Umfang bleibt offen; ähnliche Namen, Titel oder Zeilenpositionen belegen keine Beziehung.

## Mehrfachtreffer und den Umgang mit fehlenden Treffern prüfen

PostgreSQLs Definition einer qualifizierten Verknüpfung erzeugt je passendem Paar ein Ergebnis. Ein Left Join erhält außerdem linke Zeilen ohne Treffer und ergänzt auf der anderen Seite Nullwerte. Diese Definitionen helfen bei der Prüfung; hier wurde keine PostgreSQL-Datenbank betrieben. Die Übung setzt die erklärte Beziehung lokal mit Python und eigenen konstruierten Dateien um.

Prüfe vor dem Zusammenführen die Schlüsselhäufigkeiten beider Seiten. Bei einer erklärten Beobachtung je Beitrag müssen wiederholte Quellschlüssel untersucht werden. Mehrere Tag-Zeilen können dagegen richtig sein. Entscheide, ob Beiträge ohne Treffer erhalten bleiben, und erkläre die fehlende Ergänzung. Ein fehlender Tag bedeutet unbekannte Klassifikation; er macht aus beobachteten null Impressionen keinen fehlenden Impressionswert.

1. Quelleinheiten, Umfang und gewünschte Ergebniseinheit benennen.
2. Leere und wiederholte Schlüssel gegen die erklärte Beziehung prüfen.
3. Genaue Vergleichsfelder und Umgang mit fehlenden Treffern festlegen.
4. Quellzeilen, eindeutige Schlüssel und Kennzahlensummen vor der Verknüpfung behalten.
5. Mehrfachtreffer und fehlende Zuordnungen vor dem Aggregieren prüfen.

## Die gesamte Eingabe mit drei Beiträgen verfolgen

Die konstruierte Quelle enthält P01 mit 100 Impressionen und 5 Reaktionsereignissen, P02 mit 200 und 10 sowie P03 mit 0 und 0. Alle drei Beobachtungen sind 24 Stunden alt. Die Tag-Datei enthält P01/A, P01/B und P02/A. Das sind beliebige Übungs-Tags und undurchsichtige Kennungen, keine echten LinkedIn-Konten oder Bevölkerungs-Benchmarks.

Die Quelle enthält insgesamt 300 Impressionen und 15 Reaktionsereignisse für drei Beitragsschlüssel. Ein Left Join erzeugt vier Zeilen, weil P01 zwei Tags trifft; P03 bleibt ohne zugeordneten Tag erhalten. Einfaches Summieren des Ergebnisses liefert 400 Impressionen und 20 Reaktionsereignisse. Beide Quoten betragen 5%; eine Prüfung nur des Prozentsatzes übersieht die erhöhten Grundzahlen.

| Ergebnisschlüssel | Tag-Zustand | Impressionen | Reaktionsereignisse |
| --- | --- | --- | --- |
| P01 | A; zugeordnet | 100 | 5 |
| P01 | B; zugeordnet | 100 | 5 |
| P02 | A; zugeordnet | 200 | 10 |
| P03 | Nicht zugeordnet | 0 | 0 |

Vollständige eigene konstruierte Eingabe mit tatsächlicher lokaler Berechnung; keine echte Beitragsleistung.

## Auf der von der Frage benötigten Einheit aggregieren

Verwende für die ursprüngliche Beitragssumme wieder die Quelle mit einer Zeile je Beitrag oder eine ausdrücklich geprüfte Auswahl auf Beitragsebene. Für Tag A gehören P01 und P02 zur passenden ursprünglichen Beitragsmenge: 300 Impressionen. Tag B enthält P01: 100. Ihre Addition ergibt 400, weil sich die Gruppen überschneiden. Daraus wird weder eine neue Gesamtzahl aller Beiträge noch eine Zahl unterschiedlicher erreichter Menschen.

Repariere eine falsche Verknüpfung nicht durch stilles Entfernen nachträglicher Zeilen. Widersprechen sich bei gleichem Beitragsschlüssel Alter oder Wert, versteckt die Auswahl der ersten Zeile eine offene Beobachtungsregel. Sind wiederholte Tags echte Duplikate, dokumentiere diese getrennte Korrektur. Erhalte Originaldateien und Grund jeder Umformung, damit sich der Bericht aus der beabsichtigten Quelle erneut berechnen lässt.

| Frage | Erklärte Berechnung | Übungsergebnis |
| --- | --- | --- |
| Alle ursprünglichen Beiträge | Geprüfte Beitragsquelle summieren | 3 Beiträge; 300 Impressionen; 15 Ereignisse |
| Zeilen nach Tag-Ergänzung | Alle Treffer und erhaltenen Ergebniszeilen zählen | 4 Zeilen; nicht 4 unterschiedliche Beiträge |
| Beiträge mit Tag A | Unterschiedliche passende Quellbeiträge | P01 und P02; 300 Impressionen |
| Beiträge mit Tag B | Unterschiedliche passende Quellbeiträge | P01; 100 Impressionen |
| Summe A plus Summe B | Überlappende Kategoriensummen | 400; nicht die Gesamtsumme aller Beiträge |

Schlüssel auf Beitragsebene identifizieren keine unterschiedlichen erreichten Menschen.

## Drei verschiedene Verknüpfungsprobleme lösen

J1 — Berechtigte Mehrfach-Tags: Behalte beide Tag-Beziehungen von P01 für die Tag-Auswertung und die Quellsumme von 300 Impressionen für alle Beiträge. Halte für jede Ergebniszeile den ursprünglichen Schlüssel fest. Die beobachtete gleiche Quote zertifiziert die Verknüpfung nicht; die zusätzliche Zeile ist nur unter der erklärten Einheit nachvollziehbar.

J2 — Widersprüchliche Beitragsbeobachtungen: Eine Datei mit angeblich einer 24-Stunden-Beobachtung je Beitrag enthält P01 erneut. Halte die Vertragsprüfung an. Prüfe, ob ein versehentliches Duplikat oder eine andere Momentaufnahme vorliegt, die Zeitfeld oder ausdrückliche Auswahl benötigt. Summiere, verschmelze oder verwerfe keinen widersprüchlichen Wert allein für eine vertraute Gesamtsumme.

J3 — Fehlende Ergänzung oder anderer Umfang: Ein Inner Join entfernt P03 wegen des fehlenden Tags; der Left Join erhält den Beitrag mit unbekanntem Tag und beobachteter Null. Getrennt davon lässt die Prüfung eines zusammengesetzten Schlüssels eine konstruierte Zeile eines anderen Eigentümers ohne Treffer. Beides belegt weder Identität noch Umfang eines echten Exporters; fehlende Metadaten deiner tatsächlichen Dateien erfordern weiter eine Quellprüfung.

## Das begrenzte Ergebnis reproduzieren und den Vertrag festhalten

Das Paket enthält beide vollständigen CSVs, die Abstammung der vier Ergebniszeilen, das Protokoll und den Python-Checker. Führe bei bereits vorhandenem geeignetem Python im entpackten Übungsordner python3 check-joins.py aus. Er liest nur die mitgelieferten konstruierten Eingaben, berechnet die Beziehung und vergleicht die gespeicherten Ergebniszeilen, ohne sie zu überschreiben. Geprüft werden auch doppelte oder leere Schlüssel und ein konstruierter anderer zusammengesetzter Schlüssel. Datenbank, Netzabfrage und Kontozugriff sind unnötig.

Wir führten den Code am 1. November 2026 lokal aus. Das beobachtete Ergebnis lautet: drei Quellschlüssel, vier Ergebniszeilen, 300 gegenüber 400 Impressionen und 15 gegenüber 20 Ereignissen sowie beide Male 5%. Das zeigt diesen bewusst gewählten Fehlerfall, weder seine Häufigkeit in echten Exporten noch Toolüberlegenheit, Lesererfolg oder Kundennutzen. Der private Bogen hält Dateireferenzen, Einheiten, Umfang, Schlüsselbeziehung, fehlende Treffer, Quell- und Ergebnissummen sowie offene Konflikte fest. Echte private Exporte gehören nicht ins öffentliche Paket.

## Quellen und tatsächliche Ergebnisdateien

- [PostgreSQL: qualified joins, matching rows and unmatched outer-join rows](https://www.postgresql.org/docs/current/queries-table-expressions.html#QUERIES-JOIN)
- [Python 3.14: CSV dictionaries, headers and newline handling](https://docs.python.org/3.14/library/csv.html)
- [Original controlled join inputs, method and observed results](https://wrapped.li/blog-assets/data-recovery/observed-workflow-results.json)
