我们有一个表格,用于将培训师分配给计划的客户安装。在表格中,每年的每一天都有每位培训师的记录。 (我们可以,有时也可以在周末工作。)我正在构建一个搜索工具,使我们的计划员可以搜索在日期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