Tema SQL
DISTINCT ON (PostgreSQL)
Elegir una fila representativa por grupo sin GROUP BY explícito, según ORDER BY.
Descripción
Sintaxis: SELECT DISTINCT ON (expresión) … FROM … ORDER BY …. La primera fila de cada grupo DISTINCT ON es la conservada; el ORDER BY debe comenzar por las mismas expresiones que DISTINCT ON. No es estándar SQL; solo PostgreSQL.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
SELECT DISTINCT ON (cliente_id) cliente_id, id AS primer_pedido, fecha
FROM pedidos
ORDER BY cliente_id, fecha ASC;
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- ORDER BY
- Determina qué fila “gana” dentro de cada grupo DISTINCT ON.
- Portabilidad
- En otros motores suele reemplazarse por ventanas ROW_NUMBER() o GROUP BY.
Ejemplos
Ejemplo 1
SELECT DISTINCT ON (departamento_id) departamento_id, nombre, salario
FROM empleados
ORDER BY departamento_id, salario DESC;
Ejemplo 2
SELECT DISTINCT ON (a) a, b FROM t ORDER BY a, b;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.