【发布时间】:2010-12-18 05:38:20
【问题描述】:
我正在设计一个购物车。为了避免旧发票在产品价格更改后显示不准确定价的问题,我将 Product 表中的 price 字段移动到 ProductPrice 表中,该表包含 3 个字段,pid、date 和 price。 pid 和 date 构成表的主键。下面是表格的示例:
pid date price
1 1/1/09 50
1 2/1/09 55
1 3/1/09 54
使用SELECT和GROUP BY查找每个产品的最新价格,我想出了:
SELECT pid, price, max(date) FROM ProductPrice GROUP BY pid
返回的日期和 pid 准确无误。对于每个唯一的 pid,我正好收到 1 个条目,并且伴随它的日期是该 pid 的最新日期。然而,令人惊讶的是价格返回。它返回与 pid 匹配的第一行的价格,在本例中为 50。
修改我的声明后,我想出了这个:
SELECT pp.pid, pp.price, pp.date FROM ProductPrice AS pp
INNER JOIN (
SELECT pid AS lastPid, max(date) AS lastDate FROM ProductPrice GROUP BY pid
) AS m
ON pp.pid = lastPid AND pp.date = lastDate
虽然重新设计的语句现在产生了正确的价格(54),但如此简单的查询需要内部连接才能执行,这似乎令人难以置信。我的问题是,我的第二个陈述是完成我需要做的最简单的方法吗?或者我在这里错过了什么?提前致谢!
詹姆斯
【问题讨论】:
-
更简单,尽管仅在 Postgresql 上:SELECT DISTINCT ON(pid) pid, date, price FROM ProductPrice ORDER BY pid, date DESC