Eso se hace fácilmente con row_number()
función de ventana:
; 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
Ejemplo en vivo en SQL Fiddle.
No es que su salida de ejemplo no cumpla con sus requisitos. Incluye varias filas que no coinciden con ninguno de los tres criterios (primera fila, última fila, inicio tras parada).