Это действительно хороший вопрос, ответить на него было довольно сложно. сначала я ждал, пока кто-нибудь другой решит ее, но поскольку этого не произошло, я дал ей попытку, обнаружил ошибку и дал еще одну попытку.
это не красиво, но, похоже, в SQL нет функций, поддерживающих этот вопрос. Так что sql довольно сложный. Если кто-то придумает другое и лучшее решение, я буду первым, кто даст ему плюс.
declare @t table (name varchar(10), rank int, start datetime, stop datetime, code varchar(12))
insert @t values ('Joey', 52, '2011-06-21 11:30', '2011-06-21 11:45', 'BRK_Break1')
insert @t values ('Joey', 53, '2011-06-21 17:30', '2011-06-21 17:45', 'BRK_Break2')
insert @t values ('Joey', 57, '2011-06-21 14:15', '2011-06-21 15:15', 'BRK_Lunch')
insert @t values ('Joey',152, '2011-06-21 09:40', '2011-06-21 19:00', 'CONT_Shift')
insert @t values ('Joey',152, '2011-06-22 09:40', '2011-06-22 19:00', 'CONT_Shift')
;with aa as
(
select name, rank, start, 'b' action, code from @t
union all
select name, rank, stop, 'e', code from @t
)
select * from (
select name,start,
(select min(start) from aa where start > a.start and a.name = name) stop,
(select code from (select rank() OVER (ORDER BY rank) as rank, code from @t where dateadd(second, 1, a.start) between start and stop and name = a.name) c where rank = 1) code
from aa a
where not exists (select 1 from @t where a.start between start and stop and a.rank > rank and a.name = name)
and exists (select 1 from @t where a.start between start and stop and a.name = name)
) d
where code is not null and
name = 'Joey'
order by start