Sql 从数据库中获取最近和以前的条目

Sql 从数据库中获取最近和以前的条目,sql,join,timestamp,Sql,Join,Timestamp,这个站点已经有了一些关于从数据库表中为每个给定键选择最新条目的问题和答案,该表具有时间戳列。这是。我一直在使用类似的代码: SELECT DISTINCT t1.FooId, t1.BarId, t1.Status, t1.ChangeDate FROM FooBarStatusUpdate t1 INNER JOIN (SELECT FooId, BarId, MAX(ChangeDate) AS latest FROM FooBarStatusUpdate G

这个站点已经有了一些关于从数据库表中为每个给定键选择最新条目的问题和答案,该表具有时间戳列。这是。我一直在使用类似的代码:

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之间的多对多映射,以及Bar中Foo的状态以及状态更改的日期。此表中有一个条目用于每个状态更改,从条形图首次关联到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
引用鸭子的话:

SELECT DISTINCT t1.FooId, t1.BarId, t1.Status, t1.ChangeDate,
t3.Status as formerStatus
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

LEFT JOIN (SELECT FooId, BarId, Status, MAX(ChangeDate) AS nextlatest
        FROM FooBarStatusUpdate
        GROUP BY FooId, BarId, Status
        ) AS t3
ON t2.FooId = t3.FooId
AND t2.BarId = t3.BarId
AND DATEDIFF(DAY, nextlatest, t2.latest) > 0

请注意,该示例显示了MSSQL 2008的语法(即DATEDIFF函数),但是应该可以很容易地修改为其他RDBMS。您能给出包含所需结果的示例记录吗<代码>:)这有助于读者(尤其是我)提供有关该问题的更多信息。