假设我创建了一个表'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中 子句或用于聚合函数
我做错了什么?
答案 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中可用