【问题标题】:Get both most recent and prior entry from database从数据库中获取最近和以前的条目
【发布时间】:2013-03-20 06:25:24
【问题描述】:

这个网站已经有一些关于从具有时间戳列的数据库表中为每个给定键选择最新条目的问题和答案。这里是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 中的状态,以及状态更改的日期。从 Bar 首次分配给 Foo 开始,此表中的每个状态更改都有一个条目。

前几天,我需要ask a duck 询问如何不仅选择最近的项目,还选择同一键的前一个条目。在这种情况下,它是用于显示过去一个月发生了什么变化的报告,并且不仅需要显示它的变化,还需要显示它的变化。我如何修改上面的查询,我问鸭子,以获得我的客户急需的这份报告的结果?

嗯,鸭子给了我我需要的东西,所以我在下面的回答是为了帮助社区。​​p>

编辑(按 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

【问题讨论】:

  • 你能给出你想要的结果的样本记录吗? :) 它可以帮助读者(尤其是我)提供有关该问题的更多附加信息。

标签: sql join timestamp


【解决方案1】:

鸭子说:

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。
猜你喜欢
  • 2012-07-03
  • 2015-06-28
  • 2012-12-31
  • 2010-10-12
  • 2016-02-24
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多