Je comprends votre requête comme une sorte de problème de lacunes et d'îlots.
Je le résoudrais par union
les deux tables, puis en faisant une somme de fenêtre pour identifier les groupes :chaque fois qu'une connexion est rencontrée, un nouveau groupe démarre. La dernière étape consiste à agréger par groupe.
select
id,
min(case when action = 'in' then dt end) login_time,
max(case when action = 'out' then dt end) logout_time
from (
select
t.*,
sum(case when action = 'in' then 1 else 0 end)
over(partition by id order by dt) grp
from (
select id, login_time dt, 'in' action from login
union all select id, logout_time, 'out' from logout
) t
) t
group by id, grp
order by id, grp
ID | LOGIN_TIME | LOGOUT_TIME -: | :------------------------------ | :------------------------------ 1 | 19-DEC-19 03.59.33.637000000 AM | 19-DEC-19 04.34.22.535000000 AM 2 | 19-DEC-19 06.58.16.318000000 AM | 19-DEC-19 07.52.21.568000000 AM 2 | 19-DEC-19 10.19.26.039000000 AM | null 2 | 19-DEC-19 10.26.03.411000000 AM | null 2 | 19-DEC-19 01.35.56.006000000 PM | 19-DEC-19 02.06.13.585000000 PM