PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PG::Error:SELECT DISTINCT, expressões ORDER BY devem aparecer na lista de seleção


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;)