Voltar para a lista de artigos Artigos
2 minutos de leitura

Como selecionar a primeira fileira em um grupo?

Muitas vezes você deseja selecionar uma única linha de cada grupo GROUP BY. O PostgreSQL tem uma declaração especialmente para isso: SELECIONE UMA FILA DISTINTA.

Digamos que eu quero selecionar um boletim meteorológico para cada local.

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;

A consulta recupera um boletim meteorológico para cada local.

Você pode usar várias expressões na declaração 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, a consulta recupera um único relatório meteorológico para cada semana.

SELECT DISTINCT ON com ORDENAMENTO POR

O DISTINTO SELECT ON não decorado seleciona uma fila para cada grupo, mas você não sabe qual das filas será selecionada. Cada execução da consulta pode retornar filas diferentes. Use a cláusula ORDER BY se você quiser selecionar uma linha específica.

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

A consulta recupera o boletim meteorológico mais recente para cada local.

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, a consulta seleciona os dados de backup mais recentes em cada semana. As expressões SELECT DISTINCT ON têm que ser repetidas no início da cláusula ORDER BY. Você pode adicionar expressões adicionais após elas.

SELECIONE DISTINTO

Uma cláusula relacionada é a cláusula padrão SELECT DISTINCT. A cláusula padrão elimina a duplicação de linhas. SELECT DISTINCT ON elimina filas duplicando as expressões dadas.