2009-11-03 21 views
5

PostgreSQL está a punto de hacerme golpear animales pequeños. Estoy haciendo la siguiente instrucción SQL para MySQL para obtener una lista de ciudad/estado/países que son únicos.¿Cómo hago un DISTINCT y ORDER BY en PostgreSQL?

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

Pero hacer eso hace que PostgreSQL lanzar este error:

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

Pero si añado occured_at a la SELECT, luego mata de volver a la lista única.

Los resultados usando MySQL y primera consulta:

BEDFORD PARK  IL US 
ADDISON   IL US 
HOUSTON   TX US 

resultados si añado occured_at a la 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 

El primer conjunto de resultados es en última instancia lo que estoy tratando de conseguir con PostgreSQL .

Respuesta

5

Bueno, ¿cómo esperarías que Postgres determinara qué valor de occured_at usar al crear el orden de clasificación?

No sé sintaxis Postgres particular, pero se puede probar:

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 

Eso suponiendo desea que los resultados ordenados por la aparición más reciente. Si desea la primera ocurrencia, cambie MAX a MIN.

Por cierto, su título pregunta acerca de GROUP BY, pero su sintaxis especifica DISTINCT.

+0

Larry, ese segundo hizo el truco. Y perdón por el GRUPO POR en el título ... el cerebro es mucho por tratar de un centenar de cosas diferentes y por lo tanto mi mente estaba en otro lado. :) – Shpigford

+0

Siempre es un placer poder ayudar a alguien. –

Cuestiones relacionadas