我希望从特定日期开始,在指定日期的+/- 5天内,在5天的分组中总共有3个条目。只要第二列是假的。
以下是一个示例数据集。
Create Table #Data(entryDate date, complete bit)
Insert into #Data Values('2013-02-05', 1)
Insert into #Data Values('2013-02-06', 0)
Insert into #Data Values('2013-02-09', 0)
Insert into #Data Values('2013-02-11', 0)
Insert into #Data Values('2013-02-12', 0)
Insert into #Data Values('2013-02-14', 0)
鉴于2013-02-11的日期,我想要一个真实的结果,因为有两种情况符合我的条件。
或者给出2013-02-09的日期我会得到一个真实的结果,但只有一个场景满足条件
请注意,由于2013-02-05设置为true,2013-02-05,2013-02-06,2013-02-09不满足条件。
如何编写一个sql表达式,如上所述给出了我的真假。
答案 0 :(得分:2)
使用Outer Apply然后评估您的结果。
declare @data table(entryDate date, complete bit)
Insert into @data Values('2013-02-05', 1)
Insert into @data Values('2013-02-06', 0)
Insert into @data Values('2013-02-09', 0)
Insert into @data Values('2013-02-11', 0)
Insert into @data Values('2013-02-12', 0)
Insert into @data Values('2013-02-14', 0)
select *
from @data d1
outer apply (
SELECT Count(*) AS CountMatches
FROM @data d2
where
ABS(DateDiff(d,d1.entryDate,d2.entryDate)) < 5 AND
complete = 0 AND
d1.entryDate <> d2.entryDate
) t
where
t.CountMatches >=3
答案 1 :(得分:0)
我还提出以下内容,确保完成后的日期不计入5个分组中的3个
Declare @data table(Id int, entryDate date, complete bit)
Insert into @data Values(1, '2013-02-05', 1)
Insert into @data Values(2, '2013-02-06', 0)
Insert into @data Values(3, '2013-02-09', 0)
Insert into @data Values(4, '2013-02-11', 0)
Insert into @data Values(5, '2013-02-12', 0)
Insert into @data Values(6, '2013-02-14', 0)
Declare @windowMiddle date
Set @windowMiddle = '2013-02-09'
Declare @newestComplete date
select top 1 @newestComplete = entryDate from @data where complete =1 order by entryDate desc
--if(@newestComplete > @windowMiddle) --exit
;with cte as
(
select *
from @data cte
where
cte.entryDate > DATEADD(dd, -5, @windowMiddle)
and cte.entryDate >@newestComplete
and cte.entryDate < DATEADD(dd, 5, @windowMiddle)
)
select cte.entryDate, count(*)
from cte inner join cte d on cte.entryDate between DATEADD(dd, -4, d.entryDate) and d.entryDate
group by cte.entryDate
having (count(*)>=3)
也许有人可以评论BlackjacketMack's answer是否比这更好。