I think the best way to do this is to create a windows
table and join the #temp table with this new window table:
1) Step 1, preparing a window table with all possible window breaks (contains overlapping windows):
SELECT Name, dateadd(hour, -6, start_time) as start_w, dateadd(hour, +6, start_time) as end_w into
2) Create an index in temp table to improve performance
create index pw_idx on
3) Exclude overlapping windows in the choice of self-join. This is the reason for creating the index:
select p2.* into #myWindows from #possible_windows p1 right outer join #possible_windows p2 on p1.name = p2.name and p2.start_w > p1.start_W and p2.start_w <= p1.end_w where p1.name is null
4) Join your C # myWindows table or use it directly.
WORKERS:
SELECT Name, dateadd(hour, -6, start_time) as start_w, dateadd(hour, +6, start_time) as end_w, ROW_NUMBER() over(partition by Name order by Name, dateadd(hour, -6, start_time) ) as rn into
Results:
Name start_w end_w rn ----- ------------- ------------- -- David 2012-01-03 23:00:012012-01-04 11:00:011 David 2012-01-05 01:01:012012-01-05 13:01:012 John 2012-01-01 03:00:012012-01-01 15:00:011 John 2012-01-01 23:00:012012-01-02 11:00:013
PE: Please come back with the performance test results!