合并两个表以在Oracle SQL中相应地获取登录和注销时间

问题描述 投票:0回答:1

我是Oracle SQL的新手。请通过仅在Oracle SQL中提供解决方案来帮助解决此问题。

我们有两个表LOGINLOGOUT。一种用于登录数据,另一种用于注销数据,如下所述。

登录

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    

我尝试对行号进行左外部联接,这给了我以下输出

我的尝试

SELECT LI.ID,LI.LOGIN_TIME,LO.LOGOUT_TIME
FROM(
(SELECT ID,LOGIN_TIME,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY LOGIN_TIME 
) AS RNK FROM LOGIN ) LI 
LEFT OUTER JOIN
(SELECT ID,LOGOUT_TIME,ROW_NUMBER() OVER (PARTITION BY ONE_ID ORDER BY 
LOGOUT_TIME) AS RNK FROM LOGOUT ) LO 
ON TRIM(LI.one_id) = TRIM(LO.one_id) AND LI.RNK = LO.RNK ) 
ORDER BY LI.ONE_ID,LI.LOGIN_TIME,LO.LOGOUT_TIME;

我的输出

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 19-DEC-19 02.06.13.585000000 PM
2           19-DEC-19 10.26.03.411000000 AM (null)
2           19-DEC-19 01.35.56.006000000 PM (null)    

提前感谢。

sql join left-join oracle-sqldeveloper
1个回答
1
投票

我将您的查询理解为某种隔problem的问题。

我将通过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

Demo on DB Fiddle

ID | LOGIN_TIME | LOGOUT_TIME-:| :------------------------------ | :------------------------------1 | 19年12月19日03.59.33.637000000 AM | 19年12月19日04.34.22.535000000 AM2 | 19年12月19日06.58.16.318000000 AM | 19 19-DEC 19 07.52.21.568000000 AM2 | 19年12月19日10.19.26.039000000 AM | null2 | 19年12月19日10.26.03.411000000 AM | null2 | 19年12月19日01.35.56.006000000 PM | 19年12月19日02.06.13.585000000下午

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
© www.soinside.com 2019 - 2024. All rights reserved.