ProgrammationBI/analyste, Data Engineer

Comment réaliser correctement le comptage des utilisateurs uniques selon un ensemble complexe de critères en tenant compte des valeurs NULL et des doublons, en utilisant les constructions DISTINCT, COUNT, GROUP BY en SQL ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Historique de la question

Les rapports sur les utilisateurs uniques sont nécessaires pour l'analyse et les statistiques. Cependant, dans les données réelles, il y a souvent des doublons de comptes, des valeurs NULL (par exemple, un email non spécifié) et il est nécessaire de prendre en compte différents critères (par exemple, l'unicité par nom, email, IP, et parfois leurs combinaisons).

Problème

Une erreur typique consiste à calculer COUNT(DISTINCT user_id), sans tenir compte du fait qu'il y a des NULL dans les colonnes pertinentes ou des doublons non évidents (par exemple, une personne avec différents emails ou plusieurs lignes avec le même user_id mais des statuts différents). Des requêtes complexes avec GROUP BY peuvent donner des résultats incorrects si la logique d'unicité n'est pas bien pensée.

Solution

Il est important de combiner les constructions DISTINCT, GROUP BY et la filtration des NULL. Parfois, il est nécessaire de préparer préalablement les données dans un CTE ou une sous-requête, en regroupant par le bon ensemble de caractéristiques.

Exemple de code :

-- Comptage des utilisateurs uniques par email et IP, en ignorant les NULL 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;

Caractéristiques clés :

  • DISTINCT ne considère pas les lignes avec NULL dans n'importe laquelle des colonnes énumérées
  • Pour une cross-grouping, il est préférable d'utiliser GROUP BY sur la combinaison de champs
  • Lors du travail avec des doublons, les données doivent souvent être "nettoyées" au préalable

Questions pièges.

COUNT(DISTINCT ...) tient-il compte des lignes avec NULL ?

Non : si au moins une des colonnes dans la liste DISTINCT a une valeur NULL, cette combinaison est considérée comme unique (NULL n'est pas égal à NULL selon le standard SQL). Il est généralement plus pratique d'éliminer d'abord les NULL par filtrage.


Peut-on comparer NULL avec NULL via DISTINCT ?

En SQL, chaque paire de valeurs NULL est considérée comme différente, donc chaque ligne avec NULL dans n'importe laquelle des colonnes sera considérée comme distincte. Il est nécessaire d'appliquer le filtrage via IS NOT NULL.


GROUP BY donne-t-il toujours le même résultat que DISTINCT ?

Non : GROUP BY crée une ligne pour chaque combinaison de valeurs uniques, tandis que DISTINCT supprime simplement les doublons. Dans certains cas, les résultats peuvent différer, surtout lors de l'agrégation.

Erreurs typiques et anti-patrons

  • Filtration non évidente des valeurs NULL
  • Dupliqué implicite des données avant l'agrégation
  • Combinaison incorrecte de DISTINCT avec l'agrégation à différents niveaux de hiérarchie

Exemple de la vie réelle

Cas négatif

Un analyste commercial crée un rapport sur les clients uniques via COUNT(DISTINCT user_id), mais user_id peut en réalité être NULL ou être dupliqué (par exemple, des comptes temporaires). Le nombre réel d'utilisateurs se révèle plus élevé que la réalité — des indicateurs biaisés dans le rapport.

Avantages :

  • Mise en œuvre rapide du rapport

Inconvénients :

  • Décisions commerciales incorrectes dues à une métrique erronée

Cas positif

L'analyste prépare d'abord les données, filtre les NULL et les doublons évidents dans des sous-requêtes, et utilise également des opérations SET pour des critères d'unicité complexes.

Avantages :

  • Métriques correctes et transparentes
  • Décisions d'affaires et KPI valides

Inconvénients :

  • Requête plus complexe, nécessitée d'un contrôle de qualité sur les données de test