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 种方法。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
        );

(假设您不能有两个具有完全相同时间戳值的客户的订单。)

编辑: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 回答