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)
如果要按对分组行,每组的第一行视为登录,另一行视为注销,则可以使用窗口函数,如下所示:
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)