postgresql中的逐个问题

时间:2009-03-23 21:38:27

标签: sql postgresql group-by

假设我创建了一个表'orders':

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

时间戳是UNIX时间戳。现在我想为每个客户选择最新订单的ID。视图会很好。

然而以下陈述

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

导致postgre错误:

  

错误:列“orders.id”必须出现在GROUP BY中   子句或用于聚合函数

我做错了什么?

3 个答案:

答案 0 :(得分:12)

对于这些类型的东西,你可以使用2种方法。其中一个已经由Jens展示过。

其他,是使用“DISTINCT ON”条款:

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

答案 1 :(得分: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
        );

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

编辑:Postgres的DISTINCT ON是一种非常琐碎的方式。我很高兴我了解到它。但是,上述内容适用于其他RDBMS。

答案 2 :(得分:0)

kquinns的回答将修复异常,但不是你想要的。

我不知道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中可用