Można to łatwo zrobić za pomocą row_number()
funkcja okna:
; with numbered as
(
select row_number() over (order by [time]) rn
, count(*) over() as cnt
, *
from Table1
)
select *
from numbered cur
left join
numbered prev
on cur.rn = prev.rn + 1
left join
numbered next
on cur.rn = next.rn - 1
where cur.rn in (1, cur.cnt) -- first or last row
or (cur.id = 'start' and prev.id = 'stop') -- start after stop
order by
cur.rn
Przykład na żywo w SQL Fiddle.
Nie oznacza to, że przykładowe dane wyjściowe nie spełniają Twoich wymagań. Zawiera kilka wierszy, które nie spełniają żadnego z trzech kryteriów (pierwszy wiersz, ostatni wiersz, początek po zatrzymaniu).