Sql server 查找上次更新的记录,其中其他列具有特定值和状态

Sql server 查找上次更新的记录,其中其他列具有特定值和状态,sql-server,datetime,status,Sql Server,Datetime,Status,我有以下资料: Corp_ID ExpireDate RecordUpdateDate Status State 100 2013/08/02 2013-04-02 00:00:00 Active CO 100 2013/08/05 2013-08-02 00:00:00 Active CO 100 2013/08/26 2013-08-05 00:00:00 Closed NV 100

我有以下资料:

Corp_ID   ExpireDate  RecordUpdateDate       Status    State
100       2013/08/02  2013-04-02  00:00:00   Active     CO
100       2013/08/05  2013-08-02  00:00:00   Active     CO
100       2013/08/26  2013-08-05  00:00:00   Closed     NV
100       2013/10/24  2013-08-26  00:00:00   Active     CO   <<<------
100       2013/11/14  2013-10-24  00:00:00   Active     NV
100       12/31/9999  2013-11-14  00:00:00   Active     AZ

你的答案很关键

您可以使用此查询。它连接两个相同的子查询,其中我使用
densite\u rank()
获取记录更新的顺序,然后我获取连接条件中状态更改的记录:

select Y.* from
  (
  select RecordUpdateDate, Status, ExpireDate,
    dense_rank() over (order by RecordUpdateDate) as rank
  from table1
  ) X
inner join
  (
  select RecordUpdateDate, Status, ExpireDate,
    dense_rank() over (order by RecordUpdateDate) as rank
  from table1
  ) Y
on X.rank = Y.rank - 1 and X.Status = 'Closed' and Y.Status = 'Active'

这应该适用于任何SQL Server版本:

SELECT TOP 1 t1.* FROM t t1
JOIN (
  SELECT ExpireDate FROM t
  WHERE Status = 'Closed'
) t2 ON t1.ExpireDate >= t2.ExpireDate and t1.Status != 'Closed'
ORDER BY t1.ExpireDate
如果您想知道为什么要第二次检查
已关闭
,为什么要使用
=
而不是
来比较
过期
,是因为这是在检查
已关闭
状态是否会发生,那么
过期
与其后的立即
活动
记录具有相同的
过期


小提琴。我在小提琴中添加了一个额外的记录,日期与
关闭的日期相同,以检查此行为。

好的,首先让我说,Szymon的解决方案肯定是您提出的问题的答案,因此您可以将其标记为答案。但是,我想说的是,从体系结构的角度来看,有更好的方法来实现这一点,唯一的问题是需要更新数据库模式,以包括一个日志表,这使得查询与“公司”相关的“事件”变得更容易


基本上,如果服务器中有大量数据和少量资源,来自Szymon的查询可能会变得非常慢。但是,如果您保存了一个公司日志,其中记录了每个状态更改以及您想要记录的任何其他内容,那么查询此日志表将非常简单和快速,而无需进行如此多的联接和子查询

谢谢,到目前为止:)状态字段没有与之关联的过程。它可能是任何东西。谢谢,它看起来不错-但是,我必须从日期为1999年12月31日的列/行以及它的任何状态开始工作-我必须向后移动并获取它进入该状态的最新时刻。例如:WHERE status='Closed'。。。我真的不能用它作为一个过滤器,因为整个公司可能一直处于活动状态,或者价值可能一直处于“过渡”状态。。。或者它们的任意组合。这比我的好,+1!
SELECT TOP 1 t1.* FROM t t1
JOIN (
  SELECT ExpireDate FROM t
  WHERE Status = 'Closed'
) t2 ON t1.ExpireDate >= t2.ExpireDate and t1.Status != 'Closed'
ORDER BY t1.ExpireDate