该站点已经有一些关于从具有时间戳列的数据库表中为每个给定键选择最新条目的问题和答案。这是一个例子。我一直在使用类似这样的代码:
SELECT DISTINCT t1.FooId, t1.BarId, t1.Status, t1.ChangeDate
FROM FooBarStatusUpdate t1
INNER JOIN (SELECT FooId, BarId, MAX(ChangeDate) AS latest
FROM FooBarStatusUpdate
GROUP BY FooId, BarId) AS t2
ON t1.FooId = t2.FooId
AND t1.BarId = t2.BarId
AND t1.ChangeDate = t2.latest
有问题的表包含 Foo 和 Bar 之间的多对多映射,以及 Foo 在 Bar 中的状态,以及状态更改的日期。从 Bar 首次分配给 Foo 开始,此表中的每个状态更改都有一个条目。
前几天,我需要问一只鸭子,如何不仅选择最近的项目,还选择同一键的前一个条目。在这种情况下,它是用于显示过去一个月发生了什么变化的报告,并且不仅需要显示更改为 的内容,还需要显示从更改的内容。我如何修改上面的查询,我问鸭子,以获得我的客户迫切需要的这份报告的结果?
好吧,鸭子给了我我需要的东西,所以我在下面的回答是为了帮助社区。
编辑(根据 JW 的要求):
假设这是我的原始数据:
FooId BarId Status ChangeDate
2 5 New 03/27/2012
2 5 Commit 05/04/2012
2 5 Complete 07/20/2012
3 8 New 06/18/2012
3 8 Commit 08/12/2012
然后我的第一个查询(上面)将返回:
FooId BarId Status ChangeDate
2 5 Complete 07/20/2012
3 8 Commit 08/12/2012
我希望我的新查询执行的操作(以及我的回答实际上执行的操作)是返回:
FooId BarId Status Change Date Prior Status
2 5 Complete 07/20/2012 Commit
3 8 Commit 08/12/2012 New