Tôi hiểu truy vấn của bạn là một số loại vấn đề về khoảng trống và đảo.
Tôi sẽ giải quyết nó bằng union
nhập cả hai bảng, sau đó thực hiện tính tổng cửa sổ để xác định các nhóm:mỗi lần đăng nhập được đáp ứng, một nhóm mới sẽ bắt đầu. Bước cuối cùng là tổng hợp theo nhóm.
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
Bản trình diễn trên DB Fiddle :
IDID | 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