2009-11-03 12 views
5

PostgreSQL sta per farmi dare un pugno ai piccoli animali. Sto facendo la seguente dichiarazione SQL per MySQL per ottenere un elenco di città/stato/paesi che sono unici.Come si fa a DISTINCT e ORDER BY in PostgreSQL?

SELECT DISTINCT city 
       , state 
       , country 
      FROM events 
      WHERE (city > '') 
      AND (number_id = 123) 
     ORDER BY occured_at ASC 

Ma fare che rende PostgreSQL gettare questo errore:

PGError: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list

Ma se aggiungo occured_at al SELECT, quindi uccide di tornare alla lista unica.

risultati utilizzando MySQL e prima query:

BEDFORD PARK  IL US 
ADDISON   IL US 
HOUSTON   TX US 

Risultati se aggiungo occured_at al SELECT:

BEDFORD PARK  IL US 2009-11-02 19:10:00 
BEDFORD PARK  IL US 2009-11-02 21:40:00 
ADDISON   IL US 2009-11-02 22:37:00 
ADDISON   IL US 2009-11-03 00:22:00 
ADDISON   IL US 2009-11-03 01:35:00 
HOUSTON   TX US 2009-11-03 01:36:00 

La prima serie di risultati è quello che sto in ultima analisi, cercando di ottenere con PostgreSQL .

risposta

5

Bene, come ti aspetti che Postgres determini quale valore occured_at utilizzare nella creazione dell'ordine di ordinamento?

Non so sintassi Postgres in particolare, ma si potrebbe provare:

SELECT DISTINCT city, state, country, MAX(occured_at) 
     FROM events 
     WHERE (city > '') AND (number_id = 123) ORDER BY MAX(occured_at) ASC 

o

SELECT city, state, country, MAX(occured_at) 
     FROM events 
     WHERE (city > '') AND (number_id = 123) 
     GROUP BY city, state, country ORDER BY MAX(occured_at) ASC 

Questo è supponendo che si desidera che i risultati ordinati dal verificarsi PIÙ RECENTI. Se vuoi la prima occorrenza, cambia da MAX a MIN.

Per inciso, il titolo richiede su GROUP BY, ma la sintassi specifica DISTINCT.

+0

Larry, quello secondo ha fatto il trucco. E mi dispiace per il GRUPPO BY nel titolo ... il cervello è molto provante per un centinaio di cose diverse e quindi la mia mente era altrove. :) – Shpigford

+0

È sempre un piacere essere in grado di aiutare qualcuno. –