2009-03-23 5 views
4

での質問は、私のように作成したテーブル「注文」を持っていると言います。今私はすべての顧客のために最新の注文のIDを選択したいと思います。ビューとしてはいいと思う。グループ-よるPostgreSQL

しかし次の文

CREATE VIEW lastOrders AS SELECT id, 
            customerID, 
            MAX(timestamp) 
            FROM orders 
            GROUP BY customerID; 

はpostgreエラーが発生します。私は間違って

ERROR: column "orders.id" must appear in the GROUP BY clause or be used in an aggregate function

何をしているのですか?

答えて

12

これらの種類の場合、2つの方法を使用できます。 1つは既にJensによって示されている。その他

は、句「ON DISTINCT」を使用することです:

CREATE VIEW lastOrders AS 
SELECT 
DISTINCT ON (customerID) 
    id, 
    customerID, 
    timestamp 
FROM orders 
ORDER BY customerID, timestamp desc; 
+0

はpostgres docでDISTINCT ONを調べました。ちょうど私が必要なもの。非常にエレガント。ありがとう! – user54579

+0

私は同意します。これは何度も繰り返されることですが、Postgresの開発者はそれを扱ううまい方法を見つけました。標準SQLの一部ではないことを恥ずかしく思う。 – yukondude

0

kquinns答えは例外を修正しますが、探しているものではありません。

私は、MySQLの機能を知らないが、このようなものは、Oracleで動作します:

Oracleと実際
select a.* 
from 
    orders a, 
    (select customerID, max(timestamp) timestamp 
     from orders group by customerID 
    ) b 
where a.customer_id = b.customerID 
and a.timestamp = b.timestamp 

1は、分析関数を使用することができますが、私は、彼らがmysqlの

で提供されていないと思います
+0

あなたの情報のために:postgresqlに参照されるポスター。 – ChristopheD

+0

2つのタイプミス:max(タイムスタンプ)とタイムスタンプの間の 'AS'が間違っていて、a.customer_idをa.customerIDに置き換えてください。 – bortzmeyer

2

次のクエリでは、各顧客のためにだけ非常にラストオーダーを返す必要があります。

CREATE VIEW last_orders AS 
SELECT id, customer_id, timestamp 
FROM orders AS o 
WHERE timestamp = (
      SELECT MAX(timestamp) 
      FROM orders AS oi 
      WHERE o.customer_id = oi.customer_id 
     ); 

(。あなたは正確に同じタイムスタンプ値を顧客のための2つの注文を持つことができないと仮定すると)

編集:PostgresののDISTINCT ONは、これを行うの多くniftier方法です。私はそれについて学んだことがうれしいです。しかし、上記は他のRDBMSでも有効です。

+0

はい、Jens Schauderとdepeszの解決策も正しいです。 – bortzmeyer

+0

あなたはそうです。他のものも正しいです。 – yukondude

関連する問題