Điều đó dễ dàng thực hiện với row_number()
chức năng cửa sổ:
; 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
Ví dụ trực tiếp trên SQL Fiddle.
Không phải là đầu ra ví dụ của bạn không đáp ứng yêu cầu của bạn. Nó bao gồm một số hàng không khớp với ba tiêu chí (hàng đầu tiên, hàng cuối cùng, bắt đầu sau điểm dừng.)