我是Oracle SQL的新手。请仅通过Oracle SQL提供解决方案来帮助解决此问题。
我们有两个表 LOGIN 和 LOGOUT 。一种用于登录数据,另一种用于注销数据,如下所述。
登录
LOGIN_TIME ID
19-DEC-19 03.59.33.637000000 AM 1
19-DEC-19 06.58.16.318000000 AM 2
19-DEC-19 10.19.26.039000000 AM 2
19-DEC-19 10.26.03.411000000 AM 2
19-DEC-19 01.35.56.006000000 PM 2
注销
LOGOUT_TIME ID
19-DEC-19 04.34.22.535000000 AM 1
19-DEC-19 07.52.21.568000000 AM 2
19-DEC-19 02.06.13.585000000 PM 2
我想以这样的方式合并这两个表,以便获得具有各自登录和注销时间的ID。预期产量在下面提到。
预期输出
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
谢谢。
答案 0 :(得分:1)
我将您的查询理解为某种隔and的问题。
我可以通过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
答案 1 :(得分:0)
仅在登录时间少于注销时间时才需要检查情况。
Select id, l.login_time,
Case when
l.login_time<lo.logut_time
Then lo.logout_time end
From login l left join logout lo
On l.id=lo.id