SQL Server视图返回具有特定值的连续行

时间:2014-09-12 21:03:39

标签: sql view

考虑来自TestTable的这些数据:

enter image description here

我需要一个视图,它将提供最近开始的StatusDate,其中IsAssist为true。例如,IsAssist为true的最新StatusDate为2014-05-25。由于前一个记录也是IsAssist = true,我需要在计算中包含这些记录。所以" IsAssist Block"的开始是2014-05-22。这是我需要的日期。

如何编写提供此功能的视图?

3 个答案:

答案 0 :(得分:0)

这应该会给你一个良好的开端

  Select s.tableid, s.StatusDate, e,TableId, e.StatusDate
  from testable s -- for start
      left join testable e -- for end
          on e.statusdate = 
               (Select Min(StatusDate)
                From TestTable
                Where StatusDate > s.StatusDate
                    and isAssist = 1
                    and Not exists
                        (Select * From testable
                         Where StatusDate Betweens.StatusDate and e.StatusDate
                             and isAssist = 0))
  Where s.IsAssist = 1

答案 1 :(得分:0)

select *
from TestTable
where StatusDate 
between

/* the low date */

(
select min(StatusDate)
from TestTable s3

/* grab oldest entry which is <= than the high date*/



where StatusDate <= (select max(StatusDate) from TestTable s where IsAssist = 1)
and IsAssist = 1

/* but has no later isAssist = 0 rows */
and not exists 
(select 1
from TestTable s4
where s4.StatusDate > s3.StatusDate
and IsAssist = 0
)
)

和/ *高日期* /     (从TestTable中选择max(StatusDate)     其中IsAssist = 1     )     和

答案 2 :(得分:0)

好的 - 我在JL Peyret的回答帮助下成功解决了这个问题。我不得不颠倒inter语句的参数(MS什么时候这样做?它总是这样吗?)。

它的作用是通过获取StatusDate确定低日期,其中IsAssist = 0且小于IsAssist = 1的最大StatusDate。高日期只是IsAssist = 1的最大StatusDate。

在IsAssist = 1的这些日期之间进行检查并获得它,即IsAssist = 1的最新记录块。

我意识到这还没有完成。我必须覆盖低日期计算可能失败的可能性,因为没有任何记录,其中IsAssist = 0.详细信息......

JL非常亲密,因为让我走上了正确的道路而值得称赞。谢谢!

select * 
from TestTablewhere StatusDate 
between
/* the low date */
(select max(StatusDate)
from TestTable
Where IsAssist = 0
and StatusDate < (select max(StatusDate) from TestTable s where IsAssist = 1))
and
/* the high date */
(select max(StatusDate) from TestTable s where IsAssist = 1)
and IsAssist = 1