考虑来自TestTable的这些数据:
我需要一个视图,它将提供最近开始的StatusDate,其中IsAssist为true。例如,IsAssist为true的最新StatusDate为2014-05-25。由于前一个记录也是IsAssist = true,我需要在计算中包含这些记录。所以" IsAssist Block"的开始是2014-05-22。这是我需要的日期。
如何编写提供此功能的视图?
答案 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