2009-11-03 14 views
5

PostgreSQL wkrótce sprawi, że uderzę małe zwierzęta. Robię następującą instrukcję SQL dla MySQL, aby uzyskać listę miast/stanów/krajów, które są unikatowe.Jak wykonać DISTINCT i ORDER BY w PostgreSQL?

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

Ale robi sprawia, że ​​PostgreSQL rzucać ten błąd:

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

Ale jeśli dodać occured_at do wyselekcjonować, a następnie zabija od wracając unikalną listę.

Wyniki MySQL i pierwsze zapytanie:

BEDFORD PARK  IL US 
ADDISON   IL US 
HOUSTON   TX US 

Wyniki jeśli dodam occured_at do Wybierz:

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 

Pierwszy zestaw wyników jest to, co mam w końcu próbuje z PostgreSQL .

Odpowiedz

5

Jak można się spodziewać, że Postgres określi wartość occured_at, która będzie używana do tworzenia kolejności sortowania?

nie wiem składni PostgreSQL szczególnie, ale można spróbować:

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

lub

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 

Zakładając chcesz wyniki zamówionego przez najnowszego występowania. Jeśli chcesz pierwsze wystąpienie, zmień wartość MAX na MIN.

Nawiasem mówiąc, twój tytuł pyta o GROUP BY, ale twoja składnia określa DISTINCT.

+0

Larry, ten drugi załatwił sprawę. I przykro mi z powodu GROUP BY w tytule ... Mózg to dużo próba około stu różnych rzeczy, więc mój umysł był gdzie indziej. :) – Shpigford

+0

Zawsze miło jest móc komuś pomóc. –

Powiązane problemy