如何在5天内检查数据集是否包含3个条目的分组

时间:2014-01-31 01:32:39

标签: sql sql-server

我希望从特定日期开始,在指定日期的+/- 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的日期,我想要一个真实的结果,因为有两种情况符合我的条件。

  1. 2013-02-09,2013-02-11,2013-02-12
  2. 2013-02-11,2013-02-12,2013-02-14
  3. 或者给出2013-02-09的日期我会得到一个真实的结果,但只有一个场景满足条件

    1. 2013-02-09,2013-02-11,2013-02-12
    2. 请注意,由于2013-02-05设置为true,2013-02-05,2013-02-06,2013-02-09不满足条件。

      如何编写一个sql表达式,如上所述给出了我的真假。

2 个答案:

答案 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是否比这更好。