2009-11-03 6 views
5

PostgreSQLは小さな動物にパンチしようとしています。私は、ユニークな都市/州/国のリストを取得するために、MySQL用に次のSQL文を実行しています。PostgreSQLでDISTINCTとORDER BYを行うにはどうしたらいいですか?

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

しかし、それはPostgreSQLがこのエラーをスローしますやって:

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

しかし、私はSELECTにoccured_at追加した場合、それは独自のリストを取り戻すの殺します。 MySQLと最初のクエリを使用して

結果:

BEDFORD PARK  IL US 
ADDISON   IL US 
HOUSTON   TX US 

結果、私は、SELECTにoccured_at追加した場合:

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 

結果の最初のセットは、私は最終的にはPostgreSQLで取得しようとしているものです。

答えて

5

どうやら、ソート順の作成にどのoccured_at値を使用するかをPostgresが決定すると思いますか?あなたは、最新の発生順の結果をしたいと仮定しています

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

または

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 

私は特にPostgresの構文を知らない、しかし、あなたが試みることができます。最初のオカレンスが必要な場合は、MAXをMINに変更します。

タイトルにはGROUP BYについての質問がありますが、構文ではDISTINCTが指定されています。

+0

ラリーは、その2番目のトリックをしました。そして、タイトルのGROUP BYについては申し訳ありません。脳は、100種類のものを試してみることが多いので、私の心はどこかにありました。 :) – Shpigford

+0

いつでも誰かを助けることができて嬉しいです。 –

関連する問題