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).
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.
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 :
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.
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 :
Inconvénients :
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 :
Inconvénients :