我们有一个表格,用于将培训师分配给计划的客户安装。在表格中,每年的每一天都有每位培训师的记录。 (我们可以,有时也可以在周末工作。)我正在构建一个搜索工具,使我们的计划员可以搜索在日期Y和Z之间的X天数可用的教练员。

Table mySchedule

Trainer        Date       Dirty (Bit)
------------------------------------------------
Joe         06/01/2013      0
Jessica     06/01/2013      0
Alan        06/01/2013      0
Heather     06/01/2013      0
Joe         06/02/2013      1
Jessica     06/02/2013      1
Alan        06/02/2013      0
Heather     06/02/2013      0
Joe         06/03/2013      1
Jessica     06/03/2013      1
Alan        06/03/2013      1
Heather     06/03/2013      0


这是我桌子的简化版,涵盖了3天的四位培训师。如果他们有计划的东西,Dirty =1。如果他们有自由的计划,Dirty = 0。

我想构建的查询允许以下操作:


定义工作需要发生的开始日期和结束日期。
定义需要培训师的连续天数。
退还与之匹配的每个培训师,以及他们可以使用的第一天的日期至少要等于请求的天数。


纯文本示例:

客户要求在6月的任何时候有两天的培训师在现场。查询应返回:

Alan, 06/01/2013
Heather, 06/01/2013


如果客户在6月将请求更改为三天,则查询将返回:

Heather, 06/01/2013


我已经搜寻了几天,但发现有些事情似乎很接近,但最终,我无法使它们正常工作。在大多数情况下,故障的执行时间非常长。以下是一些看似有希望的方法,也许可以由比我打包的SQL-Fu更强的人来加以改编:


How to find N Consecutive records in a table using SQL
Microsoft T-SQL Counting Consecutive Records
How to find date ranges in records with consecutive dates and duplicate data

最佳答案

不确定如何针对较大的数据集执行此操作,但是对于提供的数据集,它会得到正确的结果。假定缺少数据点。

declare @startDate datetime, @endDate datetime, @days int
select @startDate = '6/1/2013', @endDate='6/3/2013', @days=2

select trainer, min(date)
from
    (
    select  trainer,date,
            (select top 1 date
            from mySchedule sInner
            where sInner.date > sOuter.date
                    and sInner.trainer = sOuter.trainer
                    and sInner.Dirty = 1
                    and sInner.date between @startDate and @endDate
            order by sInner.date) as nextDirtyDate
    from    mySchedule sOuter
    where sOuter.dirty=0
            and sOuter.date between @startDate and @endDate
    ) sub
group by trainer, nextDirtyDate
having dateDiff(d, min(date), isNull(nextDirtyDate,dateAdd(d,1,@endDate))) >= @days

10-04 10:50