Я получил приведенный выше запрос для работы, пришлось переместить псевдоним столбца (как предложено @Martin) и удалил избыточный nullIf ()
with tbl as(
select SYSTIMESTAMP+1 timestamp, 0 is_queue_empty , '' queue_name , 'qt' queue_tag, -1 session_id , 1 request_id from dual
union all
select SYSTIMESTAMP timestamp, 1 is_queue_empty , '' queue_name , 'qt1' queue_tag, -1 session_id , 1 request_id from dual
union all
select SYSTIMESTAMP+1 timestamp, 0 is_queue_empty , '' queue_name , 'qt2' queue_tag, -2 session_id , 2 request_id from dual
union all
select SYSTIMESTAMP timestamp, 1 is_queue_empty , '' queue_name , 'qt22' queue_tag, -2 session_id , 2 request_id from dual
)
select a.session_id,a.request_id,a.timestamp,a.queue_tag,
b.*
from
(
select session_id,request_id,timestamp,queue_tag,
(select min(b.timestamp) nextrec
from tbl b
where a.session_id=b.session_id
and a.request_id=b.request_id
and b.timestamp > a.timestamp
and b.is_queue_empty=0) nextrec --> had to put this outside the loop
from tbl a
where is_queue_empty=1 and queue_name is null --in oracle empty string is null thus nullif(queue_name,'') is redundant
) a
left join tbl b on a.session_id=b.session_id
and a.request_id=b.request_id
and a.nextrec = b.timestamp