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).
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.
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:
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.
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:
Nachteile:
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:
Nachteile: