ProgramaciónBI/analista, Data Engineer

¿Cómo realizar correctamente el conteo de usuarios únicos según un conjunto complejo de criterios teniendo en cuenta NULL y duplicados, utilizando las construcciones DISTINCT, COUNT, GROUP BY en SQL?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

Historia de la pregunta

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

Problema

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.

Solución

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:

  • DISTINCT no cuenta filas con NULL en cualquiera de las columnas enumeradas
  • Para agrupación cruzada, es mejor usar GROUP BY por combinación de campos
  • Al trabajar con duplicados, a menudo es necesario "limpiar" los datos previamente

Preguntas con trampa.

¿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.

Errores comunes y anti-patrones

  • Filtrado no evidente de valores NULL
  • Duplicación implícita de datos antes de la agregación
  • Combinación incorrecta de DISTINCT con agregación en diferentes niveles de jerarquía

Ejemplo de la vida real

Caso negativo

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:

  • Implementación rápida del informe

Desventajas:

  • Decisiones comerciales incorrectas debido a métricas erróneas

Caso positivo

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:

  • Métricas correctas y transparentes
  • Decisiones comerciales y KPI válidos

Desventajas:

  • Consulta más compleja, se requiere calidad de verificación en datos de pruebas