मैं आपकी क्वेरी को किसी प्रकार की अंतराल-और-द्वीप समस्या के रूप में समझता हूं।
मैं इसे union
. द्वारा हल करूंगा दोनों तालिकाओं में, फिर समूहों की पहचान करने के लिए एक विंडो योग करना:हर बार एक लॉगिन पूरा होने पर, एक नया समूह शुरू होता है। अंतिम चरण समूह द्वारा एकत्रित करना है।
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