- El operador DISTINCT
- Combinaciones únicas de varios campos
- DISTINCT ON: una versión más flexible
- Mostrar la última inscripción de cada curso
- Comparación entre DISTINCT y DISTINCT ON
Imagina que queremos saber a qué cursos se han inscrito los estudiantes en la escuela. La tabla course_members guarda los datos de inscripción. Empecemos con una consulta simple:
SELECT course_id FROM course_members ORDER BY course_id;
| course_id |
|---|
| 10 |
| 12 |
| 12 |
| ... |
Ver en DB Fiddle
Como puedes ver, algunos course_id se repiten: varios estudiantes se inscribieron en el mismo curso. Pero si solo queremos ver la lista de cursos disponibles, sin importar cuántos alumnos tenga cada uno, necesitamos eliminar los repetidos.
El operador DISTINCT
DISTINCT. Con él, la base de datos elimina los duplicados y deja una sola versión de cada valor.
SELECT DISTINCT course_id
FROM course_members
ORDER BY course_id;
| course_id |
|---|
| 10 |
| 12 |
| 15 |
| ... |
Ver en DB Fiddle
✅ Ahora cada curso aparece una sola vez.
💡 Basta con escribir DISTINCT justo después de SELECT, y funcionará para todas las columnas que incluyas en la consulta.
Combinaciones únicas de varios campos
A veces queremos que el resultado sea único no por una sola columna, sino por una combinación. Por ejemplo, cada par “curso + estudiante” debe aparecer solo una vez:
SELECT DISTINCT course_id, user_id
FROM course_members
ORDER BY course_id;
| course_id | user_id |
|---|---|
| 2 | 5 |
| 10 | 19 |
| 12 | 4 |
| 12 | 65 |
Ver en DB Fiddle
DISTINCT se escribe solo una vez, sin importar cuántas columnas uses.
DISTINCT ON: una versión más flexible
PostgreSQL tiene una variante más avanzada: DISTINCT ON. Nos permite decidir por qué campo debe haber unicidad, y al mismo tiempo mostrar otros datos relacionados.
Por ejemplo, queremos mostrar cada curso una sola vez, junto con la fecha en que el primer estudiante se inscribió:
SELECT DISTINCT ON (course_id)
course_id,
created_at
FROM course_members
ORDER BY course_id, created_at;
💬 Aquí:
DISTINCT ON(course_id) asegura que cada curso aparezca una sola vez.ORDER BY course_id, created_at define cuál fila se conserva — en este caso, la primera por fecha.
Ver en DB Fiddle
Mostrar la última inscripción de cada curso
Si queremos lo contrario —mostrar la última inscripción de cada curso— basta con cambiar el orden:
SELECT DISTINCT ON (course_id)
course_id,
created_at
FROM course_members
ORDER BY course_id, created_at DESC;
Ver en DB Fiddle
🧩 La clave es que el campo dentro de DISTINCT ON (...) debe aparecer también en ORDER BY. De lo contrario, el resultado será impredecible.
Comparación entre DISTINCT y DISTINCT ON
DISTINCTSELECT DISTINCT course_idDevuelve solo valores únicos de una o varias columnas.
DISTINCT ONSELECT DISTINCT ON (course_id)Devuelve un único valor por curso, pero con más información (por ejemplo, la fecha más reciente).
Resumen
DISTINCTelimina filas duplicadas y deja solo valores únicos.- Puedes usarlo con una o varias columnas.
DISTINCT ON(solo en PostgreSQL) permite definir exactamente qué campo debe ser único y qué otros mostrar.- El orden de los resultados depende de
ORDER BY— ¡úsalo siempre junto aDISTINCT ON!
Materiales adicionales
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.