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