考虑一天有 4 条用户登录-注销记录。我想分别确定登录和注销

ran*_*mes 1 sql oracle datetime subquery window-functions

我有以下数据

Emp.  Log data
A1.   20-JAN-2020 13:15:00
A1.   20-JAN-2020 12:00:00
A1.   20-JAN-2020 10:50:00
A1.   20-JAN-2020 07:00:00
Run Code Online (Sandbox Code Playgroud)

从上面,我想导出登录注销数据。所以 0700 AM 是第一次登录,然后提前期是注销。再次记录下一个时间。即,12:00:00

预期结果:

Emp   login                logout 
A1.   20-JAN-2020 07:00:00 20-JAN-2020 10:50:00
A1.   20-JAN-2020 12:00:00  20-JAN-2020 13:15:00
Run Code Online (Sandbox Code Playgroud)

GMB*_*GMB 5

如果要按对分组行,每组的第一行视为登录,另一行视为注销,则可以使用窗口函数,如下所示:

select emp, min(log_date) login, max(log_date) logout
from (select t.*, row_number() over(partition by emp order by log_date) rn from mytable t) t
group by emp, floor((rn - 1)/2)
Run Code Online (Sandbox Code Playgroud)

另一种选择使用lead()mod()

select emp, log_date login, lead_log_date logout
from (
    select emp, log_date, 
        row_number()   over(partition by emp order by log_date) rn,
        lead(log_date) over(partition by emp order by log_date) lead_log_date
    from mytable 
) t
where mod(rn, 2) = 1
Run Code Online (Sandbox Code Playgroud)