2015-12-18 82 views
1

我有这样的事情分组连续时间间隔

+------+-----+-----------+---------+ 
| Room | Day | StartTime | EndTime | 
+------+-----+-----------+---------+ 
| 1 | 1 | 08:00  | 09:00 | 
+------+-----+-----------+---------+ 
| 1 | 1 | 09:00  | 10:00 | 
+------+-----+-----------+---------+ 
| 1 | 1 | 13:00  | 14:00 | 
+------+-----+-----------+---------+ 
| 2 | 2 | 07:00  | 08:00 | 
+------+-----+-----------+---------+ 

我想小组由房,日期和时间间隔,但只有连续的时间间隔,例如:

+------+-----+-----------+---------+ 
| Room | Day | StartTime | EndTime | 
+------+-----+-----------+---------+ 
| 1 | 1 | 08:00  | 10:00 | 
+------+-----+-----------+---------+ 
| 1 | 1 | 13:00  | 14:00 | 
+------+-----+-----------+---------+ 
| 2 | 2 | 07:00  | 08:00 | 
+------+-----+-----------+---------+ 

我有这个代码,但我不满意,因为也是分组的空白,并抛出以下结果:

SELECT 
sd.Cod_Room, 
sd.Cod_Day, 
MIN(bd.StartTime) as StartTime, 
MAX(bd.EndTime) as EndTime 
FROM 
Schedule.ScheduleDetail AS sd 
INNER JOIN Schedule.BlockDetail AS bd ON sd.Cod_BlockDetail = bd.Cod_BlockDetail 
GROUP BY 
sd.Room, sd.Day 

+------+-----+-----------+---------+ 
| Room | Day | StartTime | EndTime | 
+------+-----+-----------+---------+ 
| 1 | 1 | 08:00  | 14:00 | 
+------+-----+-----------+---------+ 
| 2 | 2 | 07:00  | 08:00 | 
+------+-----+-----------+---------+ 

我正在阅读有关lead()和lag()的内容,但是这比我想象的要耗费更多的时间。 感谢您的帮助

+0

您使用的是哪个版本的sql server? – JamieD77

+0

@ JamieD77我正在使用2014 –

回答

3

您可以通过识别重叠的组,然后累积该值来定义组来完成此操作。以下假定SQL Server 2012+:

with t as (
     select sd.Cod_Room, sd.Cod_Day, bd.StartTime, bd.EndTime 
     from Schedule.ScheduleDetail sd INNER JOIN 
      Schedule.BlockDetail bd 
      ON sd.Cod_BlockDetail = bd.Cod_BlockDetail 
    ) 
select cod_room, cod_day, 
     min(startTime) as startTime, max(endTime) as endTime 
from (select t.*, 
      sum(IsStart) over (partition by cod_room, cod_day order by StartTime) as grp 
     from (select t.*, 
        (case when StartTime = lag(EndTime) over (partition by cod_room, cod_day order by StartTime) 
         then 0 else 1 
        end) as IsStart 
      from t 
      ) t 
    ) t 
group by cod_room, cod_day, grp; 
+0

非常好!它完美无瑕! –