Los informes sobre usuarios únicos son necesarios para análisis y estadísticas. Sin embargo, en los datos reales a menudo se encuentran duplicados de cuentas, valores NULL (por ejemplo, correo electrónico no especificado), y es necesario tener en cuenta varios criterios (por ejemplo, unicidad por nombre, correo, ip, y a veces sus combinaciones).
Un error típico es contar COUNT(DISTINCT user_id), sin considerar que en las columnas necesarias hay NULL o duplicados no evidentes (por ejemplo, una persona con diferentes correos electrónicos, o múltiples filas con un mismo user_id y diferente estado). Consultas complejas con GROUP BY pueden dar resultados incorrectos si no se ha pensado cuidadosamente la lógica de unicidad.
Es importante combinar las construcciones DISTINCT, GROUP BY y la filtración de NULL. A veces es necesario preparar los datos previamente en un CTE o subconsulta anidada, agrupando por el conjunto requerido de características.
Ejemplo de código:
-- Conteo de usuarios únicos por correo electrónico y ip, ignorando 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;
Características clave:
¿COUNT(DISTINCT ...) cuenta filas con NULL?
No: si al menos una de las columnas en la lista DISTINCT tiene un valor NULL, esa combinación se considera única (NULL no es igual a NULL de acuerdo al estándar SQL). Generalmente es más conveniente eliminar NULL primero mediante filtrado.
¿Se puede comparar NULL con NULL a través de DISTINCT?
En SQL, cada par de valores NULL se considera diferente, por lo que cada fila con NULL en cualquiera de las columnas se contará como separada. Es necesario aplicar filtrado a través de IS NOT NULL.
¿GROUP BY siempre da el mismo resultado que DISTINCT?
No: GROUP BY crea una fila por cada combinación única de valores, mientras que DISTINCT simplemente elimina duplicados. En algunos casos, los resultados son diferentes, especialmente si se aplica agregación.
Un analista de negocios elabora un informe sobre clientes únicos a través de COUNT(DISTINCT user_id), mientras que user_id en realidad puede ser NULL o duplicarse (por ejemplo, cuentas temporales). El número real de usuarios resulta ser mayor que el real, distorsionando las métricas en el informe.
Ventajas:
Desventajas:
El analista limpia previamente los datos, filtra NULL y duplicados evidentes en subconsultas, y también utiliza operaciones SET para criterios complejos de unicidad.
Ventajas:
Desventajas: