ProgrammierungBI-Analyst, Data Engineer

Wie zählt man einzigartige Benutzer korrekt anhand eines komplexen Kriterienkatalogs unter Berücksichtigung von NULL und Duplikaten unter Verwendung der Konstrukte DISTINCT, COUNT, GROUP BY in SQL?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

Hintergrund der Frage

Berichte über einzigartige Benutzer sind für Analytics und Statistik notwendig. In echten Daten treten jedoch häufig Duplikate von Konten, NULL-Werte (zum Beispiel nicht angegebene E-Mails) auf, und es müssen verschiedene Kriterien berücksichtigt werden (zum Beispiel Einzigartigkeit nach Name, E-Mail, IP oder manchmal deren Kombinationen).

Problem

Ein typischer Fehler ist das Zählen von COUNT(DISTINCT user_id), ohne zu berücksichtigen, dass in den relevanten Spalten NULL oder nicht offensichtliche Duplikate vorhanden sind (zum Beispiel eine Person mit unterschiedlichen E-Mails oder mehrere Zeilen mit derselben user_id aber unterschiedlichem Status). Komplexe Abfragen mit GROUP BY können falsche Ergebnisse liefern, wenn die Logik der Einzigartigkeit nicht durchdacht ist.

Lösung

Es ist wichtig, die Konstrukte DISTINCT, GROUP BY und NULL-Filterung zu kombinieren. Manchmal ist es erforderlich, die Daten in einer CTE oder einer verschachtelten Abfrage vorzubereiten, indem man nach den erforderlichen Eigenschaften gruppiert.

Codebeispiel:

-- Zählen einzigartiger Benutzer nach E-Mail und IP, NULL ignorieren SELECT COUNT(*) AS unique_users FROM ( SELECT DISTINCT email, ip_address FROM users WHERE email IS NOT NULL AND ip_address IS NOT NULL ) u;

Wichtige Merkmale:

  • DISTINCT ignoriert Zeilen mit NULL in einer der aufgeführten Spalten
  • Für Cross-Gruppierungen ist es besser, GROUP BY nach einer Kombination von Feldern zu verwenden
  • Bei der Arbeit mit Duplikaten müssen die Daten häufig zuerst „bereinigt“ werden

Fangfragen.

Zählt COUNT(DISTINCT ...) auch Zeilen mit NULL?

Nein: Wenn einer der Spalten in der DISTINCT-Liste NULL ist, wird diese Kombination als einzigartig betrachtet (NULL ist gleich NULL gemäß SQL-Standard). Es ist normalerweise einfacher, zuerst NULL durch Filterung zu entfernen.


Kann man NULL mit NULL durch DISTINCT vergleichen?

In SQL wird jedes Paar von NULL-Werten als unterschiedlich betrachtet, daher wird jede Zeile mit NULL in einer der Spalten als separat angesehen. Die Filterung durch IS NOT NULL ist erforderlich.


Gibt GROUP BY immer dasselbe Ergebnis wie DISTINCT?

Nein: GROUP BY erzeugt eine Zeile für jede nicht wiederholende Kombination von Werten, während DISTINCT einfach Duplikate entfernt. In einigen Fällen sind die Ergebnisse unterschiedlich, insbesondere wenn Aggregationen angewendet werden.

Typische Fehler und Anti-Pattern

  • Nicht offensichtliche Filterung von NULL-Werten
  • Implizite Duplizierung von Daten vor der Aggregation
  • Falsche Kombination von DISTINCT mit Aggregationen auf verschiedenen Hierarchieebenen

Beispiel aus dem echten Leben

Negativer Fall

Ein Business-Analyst erstellt einen Bericht über einzigartige Kunden durch COUNT(DISTINCT user_id), während user_id tatsächlich NULL sein kann oder dupliziert wird (zum Beispiel temporäre Konten). Die tatsächliche Anzahl der Benutzer ist größer als die reale — verzerrte Kennzahlen im Bericht.

Vorteile:

  • Schnelle Umsetzung des Berichts

Nachteile:

  • Falsche Geschäftsentscheidungen aufgrund einer fehlerhaften Metrik

Positiver Fall

Ein Analyst bereinigt die Daten im Voraus, filtert NULL und offensichtliche Duplikate in Unterabfragen und verwendet auch SET-Operationen für komplexe Kriterien der Einzigartigkeit.

Vorteile:

  • Korrekte und transparente Kennzahlen
  • Gültige Geschäftsentscheidungen und KPIs

Nachteile:

  • Komplexere Abfrage, höhere Anforderungen an die Qualität der Tests