Eu sei que essa é uma pergunta bastante antiga, mas acabei de passar por um pequeno exemplo na minha cabeça que me ajudou a entender por que o Postgres tem essa restrição aparentemente estranha nas colunas SELECT DISTINCT / ORDER BY.
Imagine que você tenha os seguintes dados em sua tabela Rsvp:
event_id | start_time
----------+------------------------
0 | Mar 17, 2013 12:00:00
1 | Jan 1, 1970 00:00:00
1 | Aug 21, 2013 16:30:00
2 | Jun 9, 2012 08:45:00
Agora você quer pegar uma lista de event_ids distintos, ordenados por seus respectivos start_times. Mas onde deve
1
vai? Deve vir primeiro, porque a única tupla começa em 1º de janeiro de 1970, ou deve ser a última por causa de 21 de agosto de 2013? Como o sistema de banco de dados não pode tomar essa decisão por você e a sintaxe da consulta não pode depender dos dados reais em que pode estar operando (assumindo que
event_id
é exclusivo), estamos restritos a ordenar apenas por colunas do SELECT
cláusula. Quanto à pergunta real - uma alternativa à resposta de Matthew é usar uma função agregada como
MIN
ou MAX
para a classificação: SELECT event_id
FROM Rsvp
GROUP BY event_id
ORDER BY MIN(start_time)
O agrupamento e agregação explícitos em
start_time
permitir que o banco de dados apresente uma ordenação inequívoca das tuplas de resultados. Observe, no entanto, que a legibilidade é definitivamente um problema neste caso;)