PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PG::Errore:le espressioni SELECT DISTINCT, ORDER BY devono apparire nell'elenco di selezione

So che questa è una domanda piuttosto vecchia, ma ho appena passato un piccolo esempio nella mia testa che mi ha aiutato a capire perché Postgres ha questa restrizione apparentemente strana sulle colonne SELECT DISTINCT / ORDER BY.

Immagina di avere i seguenti dati nella tua tabella 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

Ora vuoi prendere un elenco di event_id distinti, ordinati in base ai rispettivi orari di inizio. Ma dove dovrebbe 1 andare? Dovrebbe venire prima, perché l'unica tupla inizia il 1 gennaio 1970, o dovrebbe durare a causa del 21 agosto 2013?

Poiché il sistema di database non può prendere questa decisione per te e la sintassi della query non può dipendere dai dati effettivi su cui potrebbe operare (supponendo event_id è unico), siamo limitati a ordinare solo per colonne da SELECT clausola.

Per quanto riguarda la domanda vera e propria, un'alternativa alla risposta di Matthew è usare una funzione aggregata come MIN o MAX per l'ordinamento:

  SELECT event_id
    FROM Rsvp
GROUP BY event_id
ORDER BY MIN(start_time)

Il raggruppamento e l'aggregazione espliciti su start_time consentire al database di elaborare un ordinamento inequivocabile delle tuple dei risultati. Nota, tuttavia, che la leggibilità è sicuramente un problema in questo caso;)