hast Du das ausprobiert? Ich habe kein MySQL 8 da, aber MariaDB 10 und MS SQL Server 2012 können auch LAG und LEAD und da liefert LEAD nur was wenn der Satz auch im Query-Result enthalten ist.
Ich habs nicht getestet, das könnte ein Problem sein, vielleicht kann man es mit einer Subquery lösen. Irgendwie so (?):
select * from (
select
id,
lead(id) over w as lead_id,
lag(id) over w as lag_id
from `table`
window w as (order by id)
) where id = ?