我在设计购物车。为了避免旧产品发票在产品价格发生变化后显示不准确的问题,我将产品表中的价格字段转移到由3个字段(pid,日期和价格)组成的ProductPrice表中。 pid和日期形成表格的主键。这是一个什么样的表看起来像一个例子:SQL“GROUP BY”问题
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 – 2009-11-23 06:36:19