以下查询根据您的定义在数据中查找周期。它首先使用相关的子查询来确定记录是否是一个周期的开始(即与较早的时间段没有重叠)。然后,它将“
periodStart”分配为最近的开始,即不重叠周期的开始。
以下(未经测试的)查询采用了这种方法:
with TimeWithOverlap as ( select t.*, (case when exists (select * from dbo.Available tbefore where t.availStart > tbefore.availStart and tbefore.availEnd >= t.availStart) then 0 else 1 end) as IsPeriodStart from dbo.Available t ), TimeWithPeriodStart as ( select two.*, (select MAX(two1.AvailStart) from TimeWithOverlap two1 where IsPeriodStart = 1 and two1.AvailStart <= two.AvailStart ) as periodStart from TimeWithOverlap two )select periodStart, MAX(AvailEnd) as periodEndfrom TimeWithPeriodStart twpsgroup by periodStart;
http://sqlfiddle.com/#!6/3483c/20(第二个查询)
如果两个周期都同时开始,则它仍然有效,因为AvailStart值相同。由于相关的子查询,即使在中等大小的数据集上,这也可能效果不佳。
还有其他方法可以解决此问题。例如,如果您有SQL Server 2012,则可以使用累积和函数,该函数提供了一种更简单的方法。



