2009-11-03 17 views
5

PostgreSQL, küçük hayvanları yumruklamak üzeredir. Benzersiz bir şehir/eyalet/ülke listesi almak için MySQL için aşağıdaki SQL deyimini yapıyorum. PostgreSQL'de DISTINCT ve ORDER BY'yi nasıl yaparım?

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

Ama

o PostgreSQL bu hatayı atmak yapar yapıyor:

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

Ama SELECT occured_at eklerseniz, o zaman benzersiz bir liste geri almanın öldürür. MySQL ve ilk sorguyu kullanarak

Sonuçlar:

BEDFORD PARK  IL US 
ADDISON   IL US 
HOUSTON   TX US 

Sonuçları Ben SELECT occured_at eklerseniz:

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 

sonuçlarının ilk seti Ben sonuçta PostgreSQL ile almaya çalışıyorum budur .

cevap

5

Peki, Postgres'in sıralama düzenini oluştururken hangi evented_at değerinin kullanılacağını belirlemesini nasıl beklersiniz?

Özellikle Postgres sözdizimi bilmiyorum ama deneyebilirsiniz:

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

veya EN SON oluşum tarafından sipariş sonucu farz ediyor

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 

. İlk oluşumu istiyorsanız, MAX değerini MIN olarak değiştirin.

Bu arada, başlığınız GROUP BY hakkında sorar, ancak sözdizimi DISTINCT değerini belirtir.

+0

Larry, ikincisi de hile yaptı. Başlıktaki GROUP BY hakkında üzgünüm ... beynim yüzlerce farklı şeyi denemekten çok fazla ve aklım başka bir yerdeydi. :) – Shpigford

+0

Birilerine yardım edebilmek için her zaman bir zevk. –