Uso de SQL GROUP BY y HAVING para Detectar Valores Duplicados
5 min de lectura
Uso de SQL GROUP BY y HAVING para Detectar Valores Duplicados
Los registros duplicados son uno de los problemas más comunes en bases de datos del mundo real. Ya sea que trabajes en finanzas, salud, logística, educación, análisis de datos o plataformas SaaS, las empresas esperan que los desarrolladores junior e intermedios sepan identificar, investigar y limpiar datos duplicados de forma eficiente.
Esto no es solo una habilidad de “sintaxis SQL”. Es una competencia de negocio práctica directamente relacionada con la precisión de reportes, la prevención de fraudes, la confiabilidad operativa y la garantía de calidad de datos.
Los reclutadores y entrevistadores técnicos evalúan frecuentemente a los candidatos con problemas como:
- Detección de facturas duplicadas
- Registros de usuarios repetidos
- Múltiples transacciones con la misma marca de tiempo
- Inconsistencias en migraciones de datos
- Anomalías en registros de eventos
- Importaciones duplicadas desde sistemas externos
Comprender correctamente el uso de GROUP BY y HAVING te permite resolver estos problemas de forma eficiente y demostrar competencia real en ingeniería backend.
## Por qué las empresas valoran la detección de duplicados
Muchos desarrolladores junior se enfocan únicamente en crear funcionalidades. Los ingenieros backend sólidos entienden la integridad de los datos.
Las empresas pierden dinero cuando los duplicados generan:
- Paneles de analítica incorrectos
- Pagos duplicados
- Correos o notificaciones repetidas
- Conteos de inventario incorrectos
- Reportes de auditoría engañosos
- Sincronización defectuosa entre sistemas
En entrevistas, los candidatos que saben explicar cómo identificar y aislar duplicados destacan inmediatamente porque demuestran pensamiento operativo y no solo conocimiento superficial de tutoriales.
## Conceptos fundamentales de SQL para detectar duplicados
### 1. GROUP BY
La cláusula GROUP BY agrupa filas que comparten los mismos valores.
Ejemplo:
SELECT email
FROM users
GROUP BY email;
Esta consulta agrupa todos los correos electrónicos iguales.
### 2. COUNT()
La función COUNT() calcula cuántas filas existen dentro de cada grupo.
SELECT email, COUNT()
FROM users
GROUP BY email;
Esto muestra cuántas veces aparece cada correo.
### 3. HAVING
La cláusula HAVING filtra resultados después de la agregación.
SELECT email, COUNT()
FROM users
GROUP BY email
HAVING COUNT() > 1;
Esto devuelve únicamente los correos duplicados.
## Patrón fundamental de detección de duplicados
La mayoría de los casos de detección de duplicados siguen esta estructura:
SELECT column_name, COUNT()
FROM table_name
GROUP BY column_name
HAVING COUNT() > 1;
Este patrón es extremadamente importante porque aparece en:
- Entrevistas técnicas
- Tareas de limpieza de bases de datos
- Scripts de validación de migraciones
- Flujos de depuración en producción
- Auditoría de analítica
## Detección de duplicados en múltiples columnas
Los sistemas empresariales reales rara vez dependen de una sola columna. La detección de duplicados suele requerir combinaciones de valores.
Ejemplo:
SELECT nombre, apellido, fecha_nacimiento, COUNT()
FROM clientes
GROUP BY nombre, apellido, fecha_nacimiento
HAVING COUNT() > 1;
Esta consulta detecta clientes con la misma combinación de identidad completa.
Los empleadores valoran a los desarrolladores que entienden reglas de duplicación compuestas, ya que los sistemas empresariales dependen del negocio y no solo de identificadores simples.
## Trabajo con duplicados basados en timestamps
Los timestamps introducen un desafío más avanzado.
Imagina un sistema que almacena:
- Registros de actividad de usuarios
- Eventos de procesamiento de pagos
- Lecturas de sensores
- Entradas de auditoría de seguridad
- Eventos de mensajería del sistema
Dos timestamps pueden diferir en milisegundos y aun así representar el mismo evento lógico.
Aquí es donde la normalización de timestamps se vuelve esencial.
## Detectar duplicados en el mismo segundo
Un requisito común es:
“Encontrar registros que ocurren en el mismo segundo”.
En lugar de comparar el timestamp completo, se normaliza la precisión.
### Ejemplo MySQL
SELECT user_id,
DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s') AS segundo,
COUNT()
FROM logs
GROUP BY user_id, segundo
HAVING COUNT() > 1;
### Ejemplo PostgreSQL
SELECT user_id,
DATE_TRUNC('second', created_at) AS segundo,
COUNT()
FROM logs
GROUP BY user_id, segundo
HAVING COUNT() > 1;
Esto demuestra una habilidad profesional importante:
- Traducir reglas de negocio a lógica de datos
- Normalizar valores antes de comparar
- Reducir ruido de precisión en timestamps
## Detección de eventos repetidos en diferentes días
Algunos sistemas requieren detectar acciones repetidas a la misma hora en días distintos.
Ejemplo:
“Mostrar registros donde el mismo usuario realiza acciones exactamente en el mismo segundo en varios días”.
En este caso se ignora la fecha.
Ejemplo de consulta:
SELECT user_id,
TIME(created_at) AS hora_repetida,
COUNT()
FROM activity_logs
GROUP BY user_id, hora_repetida
HAVING COUNT() > 1;
Esto es útil en:
- Detección de fraude
- Análisis de bots
- Auditoría de procesos automáticos
- Verificación de sistemas programados
## Patrones avanzados de lógica de negocio
### 1. Transacciones duplicadas
SELECT customer_id,
amount,
transaction_date,
COUNT()
FROM payments
GROUP BY customer_id, amount, transaction_date
HAVING COUNT() > 1;
Útil en auditoría financiera.
### 2. Subidas de archivos duplicadas
SELECT file_hash, COUNT()
FROM uploads
GROUP BY file_hash
HAVING COUNT() > 1;
Común en optimización de almacenamiento.
### 3. Registros de eventos duplicados
SELECT event_type,
TIME(created_at),
COUNT()
FROM system_logs
GROUP BY event_type, TIME(created_at)
HAVING COUNT() > 1;
## Recuperar filas completas duplicadas
Uno de los errores más comunes es devolver solo datos agrupados sin las filas completas.
La forma correcta:
SELECT t.
FROM users t
JOIN (
SELECT email
FROM users
GROUP BY email
HAVING COUNT() > 1
) duplicados
ON t.email = duplicados.email;
Este enfoque combina:
- Agregación
- Subconsultas
- JOIN
- Investigación de datos
## Preguntas comunes de entrevista
### Pregunta 1
“¿Cómo encontrarías usuarios duplicados en una base de datos?”
Respuesta fuerte:
- Usar GROUP BY en los campos identificadores
- Aplicar COUNT()
- Filtrar con HAVING COUNT() > 1
- Hacer JOIN para obtener registros completos
### Pregunta 2
“¿Cómo detectar eventos duplicados en el mismo segundo?”
Respuesta fuerte:
- Normalizar timestamps
- Truncar precisión a segundos
- Agrupar por valor normalizado
## Ideas de proyectos
