Volver a la lista de artículos Artículos
Lectura de 2 minutos

¿Cómo seleccionar la primera fila de un grupo?

A menudo se quiere seleccionar una sola fila de cada grupo GROUP BY. PostgreSQL tiene una sentencia especialmente para eso: SELECT DISTINCT ON.

Digamos que quiero seleccionar un informe meteorológico para cada localidad.

location time report
Ottawa 2014-05-15 8:00 sunny
2014-05-15 11:00 cloudy
2014-05-15 15:00 rainy
Warsaw 2014-05-15 8:00 overcast
2014-05-15 11:00 sunny
2014-05-15 15:00 rainy

SELECT DISTINCT ON (location) location, time, report
FROM weather_reports;

La consulta recupera un informe meteorológico para cada localidad.

Puede utilizar varias expresiones en la sentencia SELECT DISTINCT ON.

SELECT DISTINCT ON (creation_date_week, resource_id) 
  id,
  creation_date, 
  date_trunc('week', creation_date) creation_date_week,
  resource_id
FROM backup_data;

Para cada recurso, la consulta recupera un solo dato de respaldo para cada semana.

SELECT DISTINCT ON con ORDER BY

La sentencia SELECT DISTINCT ON sin ordenar selecciona una fila para cada grupo, pero no se sabe cuál de las filas se seleccionará. Cada ejecución de la consulta puede devolver filas diferentes. Utilice la cláusula ORDER BY si desea seleccionar una fila específica.

SELECT DISTINCT ON (location) location, time, report
FROM weather_reports
ORDER BY location, time DESC;

La consulta recupera el informe meteorológico más reciente de cada localidad.

SELECT DISTINCT ON (creation_date_week, resource_id)
  id,
  creation_date, 
  date_trunc('week', creation_date) creation_date_week,
  resource_id
FROM backup_data
ORDER BY creation_date_week, resource_id, creation_date DESC;

Para cada recurso, la consulta selecciona los datos más recientes de las copias de seguridad de cada semana. Las expresiones SELECT DISTINCT ON deben repetirse al principio de la cláusula ORDER BY. Puede añadir expresiones adicionales después de ellas.

SELECT DISTINCT

Una cláusula relacionada es la cláusula SELECT DISTINCT estándar. La cláusula estándar elimina las filas duplicadas. SELECT DISTINCT ON elimina las filas que duplican las expresiones dadas.