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

时间:2013-03-29 14:21:37

标签: sql join timestamp

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

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首次分配给Foo开始。

前几天,我需要ask a duck关于如何不仅选择最近的项目,还要选择相同键的前一个条目。在这种情况下,报告显示过去一个月内发生了哪些变化,并且不仅需要显示的更改内容,还需要显示更改的内容。我怎么能修改上面的查询,我问鸭子,为我的客户迫切需要的报告得到结果?

嗯,鸭子给了我所需要的东西,所以我自己的答案就在这里,希望能帮助社区。

编辑(根据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

1 个答案:

答案 0 :(得分:0)

说明鸭子:

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