DISTINCT frente a GROUP BY para obtener valores únicos
Sepa cuándo DISTINCT es la respuesta adecuada y cuándo el entrevistador espera GROUP BY
DISTINCT frente a GROUP BY para obtener valores únicos es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding Interview Prep incluye 4 lecciones en total.
Qué hace DISTINCT
DISTINCT elimina las filas duplicadas. Lo importante que comprueban los entrevistadores es que actúa sobre la fila seleccionada completa, no sobre una sola columna; por eso SELECT DISTINCT a, b elimina duplicados del par (a, b).
SELECT DISTINCT department
FROM employees;DISTINCT abarca todas las columnas seleccionadas
Cuando hay varias columnas, DISTINCT conserva cada combinación única: una fila por cada par distinto (department, job_title). No existe una forma estándar de eliminar duplicados de una sola columna.
SELECT DISTINCT department, job_title
FROM employees;Qué hace GROUP BY
GROUP BY agrupa en una sola las filas que comparten la misma clave. Por sí solo, agrupar por una columna produce el mismo resultado que aplicar DISTINCT a esa columna.
SELECT department
FROM employees
GROUP BY department;
-- equivalent to:
SELECT DISTINCT department
FROM employees;La diferencia real: la agregación
Entonces, ¿cuándo difieren? Cuando necesita una agregación. GROUP BY puede calcular COUNT, SUM o AVG por grupo; DISTINCT no. ¿Necesita filas únicas? DISTINCT. ¿Una métrica por grupo? GROUP BY.
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;DISTINCT no puede contar por grupo
No puede añadir un conteo a DISTINCT. Para saber «cuántos empleados hay por departamento», la herramienta correcta es siempre GROUP BY con COUNT(*), no SELECT DISTINCT.
-- WRONG intent: this errors or returns one total row
-- SELECT DISTINCT department, COUNT(*) FROM employees;
-- RIGHT:
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;COUNT(DISTINCT) combina ambas ideas
Una combinación muy útil: COUNT(DISTINCT col) cuenta los valores únicos dentro de cada grupo. Aquí DISTINCT está dentro de la agregación y responde a la pregunta «¿cuántos títulos distintos hay por departamento?».
SELECT department,
COUNT(DISTINCT job_title) AS distinct_titles
FROM employees
GROUP BY department;Contar valores distintos en general
Sin GROUP BY, COUNT(DISTINCT col) cuenta los valores únicos de toda la tabla: una respuesta clara a la pregunta «¿cuántos departamentos diferentes tenemos?».
SELECT COUNT(DISTINCT department) AS n_departments
FROM employees;
-- equivalently, count the deduped subquery
SELECT COUNT(*)
FROM (SELECT DISTINCT department FROM employees) d;El rendimiento suele ser equivalente
¿Es más rápido DISTINCT o GROUP BY? Para eliminar duplicados sin más, normalmente son equivalentes: los optimizadores los planifican de forma similar. Elija según la intención: DISTINCT para filas únicas y GROUP BY cuando agregue datos.
DISTINCT y NULL
¿Cómo trata NULL DISTINCT? Considera que todos los NULL son iguales, por lo que muchas filas con NULL se reducen a una sola. GROUP BY hace lo mismo: los NULL forman un único grupo.
-- If manager_id has several NULLs, this returns one NULL row
SELECT DISTINCT manager_id
FROM employees;DISTINCT ON de Postgres como extra
Como extra, Postgres tiene un DISTINCT ON (expr) no estándar que conserva la primera fila de cada clave según un ORDER BY. El código portable usa ROW_NUMBER() en su lugar.
-- Postgres only: latest order per customer
SELECT DISTINCT ON (customer_id) customer_id, order_id, order_date
FROM orders
ORDER BY customer_id, order_date DESC;DISTINCT se aplica a todo el SELECT, no a una sola columna
Otra trampa: DISTINCT actúa sobre la fila completa, por lo que SELECT DISTINCT customer_id, order_date no devolverá una fila por cliente. Para eso, use GROUP BY con MAX o una función de ventana.
-- Does NOT give one row per customer
SELECT DISTINCT customer_id, order_date FROM orders;
-- One row per customer: latest order date
SELECT customer_id, MAX(order_date) AS last_order
FROM orders
GROUP BY customer_id;Comprobación rápida
Elija la herramienta adecuada.
Resumen
Resumen: DISTINCT elimina duplicados de filas completas; GROUP BY agrupa por clave y permite realizar agregaciones. COUNT(DISTINCT col) cuenta valores únicos, ambos tratan los NULL como uno solo y el rendimiento suele ser equivalente.
Preguntas frecuentes
¿La lección «DISTINCT frente a GROUP BY para obtener valores únicos» es gratis?
Sí — el texto completo de «DISTINCT frente a GROUP BY para obtener valores únicos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding Interview Prep incluye 4 lecciones en total.
¿Qué aprenderé en «DISTINCT frente a GROUP BY para obtener valores únicos»?
Sepa cuándo DISTINCT es la respuesta adecuada y cuándo el entrevistador espera GROUP BY Practicas Coding Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Coding Interview Prep?
No se requiere experiencia previa. Coding Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «DISTINCT frente a GROUP BY para obtener valores únicos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Coding Interview Prep?
Sí. Cada lección de Coding Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Proyección de columnas y problemas con los alias
- Columnas calculadas y precedencia de expresiones
- DISTINCT frente a GROUP BY para obtener valores únicos
- Expresiones CASE en SELECT