Itu mudah dilakukan dengan row_number()
fungsi jendela:
; 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
Contoh langsung di SQL Fiddle.
Bukan berarti keluaran contoh Anda tidak memenuhi persyaratan Anda. Ini mencakup beberapa baris yang tidak cocok dengan salah satu dari tiga kriteria (baris pertama, baris terakhir, mulai setelah berhenti.)