4

次のように作成された「注文」テーブルがあるとします。

CREATE TABLE orders (id SERIAL, 
                     customerID INTEGER,
                     timestamp BIGINT, 
                     PRIMARY KEY(id));

Timestamp は UNIX タイムスタンプです。ここで、すべての顧客の最新の注文の ID を選択したいと考えています。ビューとしてはいいでしょう。

ただし、次のステートメント

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

postgre エラーが発生します。

エラー: 列 "orders.id" は GROUP BY 句に指定するか、集計関数で使用する必要があります

私は何を間違っていますか?

4

3 に答える 3

12

この種のものには、2 つのアプローチを使用できます。1つはすでにJensによって示されています。

その他、「DISTINCT ON」句を使用することです:

CREATE VIEW lastOrders AS
SELECT
DISTINCT ON (customerID)
    id,
    customerID,
    timestamp
FROM orders
ORDER BY customerID, timestamp desc;
于 2009-03-23T22:43:14.230 に答える
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 つの注文を持つことはできないと仮定します。)

編集: PostgresDISTINCT ONは、これを行うためのより優れた方法です。私はそれについて学んだことをうれしく思います。ただし、上記は他の RDBMS でも機能します。

于 2009-03-24T02:48:35.967 に答える
0

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

mysql の機能はわかりませんが、次のようなものが 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

実際、Oracleでは分析関数を使用できますが、mysqlでは使用できないと思います

于 2009-03-23T21:55:21.100 に答える