2013-12-16 24 views
0

我有以下几点:查找最近更新的记录,而其他列具有特定的价值和地位

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 

我想获得对应于到期日期2013/10/24记录。我的目标是显示当前状态(主动 - 最低行)开始的时刻。正确的回报将是2013/10/24,因为当公司从状态“已关闭”更新为“已激活”状态时。

答案是(我认为)

select top 1 Y.* from 
    (
    select RecordUpdateDate, Status, ExpireDate, 
    dense_rank() over (order by RecordUpdateDate desc) as rank 
    from [dbo].[Table_1] 
) X 
inner join 
    (
    select RecordUpdateDate, Status, ExpireDate, 
    dense_rank() over (order by RecordUpdateDate desc) as rank 
    from [dbo].[Table_1] 
) Y 
on X.rank = Y.rank- 1 where X.Status <> Y.Status 

你的答案是关键!

+0

谢谢两者,到目前为止.. :) – user3105932

+0

状态字段没有相关的过程。它可能是任何东西。谢谢,这看起来不错 - 但是,我必须从具有日期12/31/9999的列/行以及它的任何状态开始工作 - 我必须向后移动并获得最近一次进入该状态的时刻。 – user3105932

+0

例如:WHERE状态='关闭' ...我无法真正使用它作为过滤器,因为整个公司可能一直活跃的整个时间或价值可能是在整个时间'过渡'...或任何他们的组合。 – user3105932

回答

0

您可以使用此查询。它加入我曾经dense_rank()获得记录更新的顺序2个相同的子查询,然后我得到其中的地位在连接条件改变了记录:

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 Fiddle Demo

1

这应该任何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 

如果你想知道为什么没有为Closed第二项检查,并使用>=,而不是为什么ExpireDate比较是因为这是检查Closed发生的状态与它之后的立即Active记录具有相同的ExpireDate

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

+1

这比我的更好,+1! – Szymon

0

好的,让我开始说,Szymon的解决方案绝对是您所做问题的答案,因此您需要将其标记为答案。但是,我想表达的是,从架构的角度来看,有更好的方法来实现这一点,唯一的问题是它会要求您更新数据库模式以包含日志表,这样可以更轻松地查询“事件”发生在与“公司”有关的事情上。

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

相关问题