[英]SQL Server View to Return Consecutive rows with a Specific Value
考虑来自TestTable的以下数据:
我需要一个能够提供IsAssist为true的最新开始StatusDate的视图。 例如,IsAssist为true的最新StatusDate是2014-05-25。 由于之前的记录也是IsAssist = true,因此我需要在计算中包括这些记录。 因此,“ IsAssist Block”的开头是2014-05-22。 这是我需要的日期。
我该如何写一个可以提供这种效果的视图?
这应该给你一个好的开始
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
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的IsAssist = 1处选择max(StatusDate))和
好的-我在JL Peyret的回应下设法解决了这个问题。 我必须反转之间语句的参数(MS何时执行此操作?是否一直这样?)。
它的作用是通过获取IsAssist = 0的StatusDate并小于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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.