2017-08-07 77 views
1

我在Oracle 11g中有一个表LOGIN_DETAILS,其中保存了每次登录后的用户详细信息。我想在任何30分钟的时间间隔内获取超过5次登录的用户的姓名。基于计数并在一定的时间间隔内提取记录

例子:

考虑以下记录:

enter image description here

在上面记录MACK做内17年7月8日5点10分17秒和17年7月8日6个登录05:40:17这是间隔30分钟内。 所以查询应该返回名称'MACK'作为输出。

:30分钟间隔没有预先定义的,即它不从均为30分钟间隔应该开始定义。

在此先感谢。

回答

1

使用lag()。下面得到最后一行时,有5在30分钟内:

select t.* 
from (select t.*, 
      lag(login_timestamp, 4) over (partition by unique_code order by login_timestamp) as prev_lt 
     from t 
    ) t 
where login_timestamp < prev_lt + interval '30' minute; 

注意,lag()追溯到4条记录,因为目前战绩是第五。

1

类似的东西

with t as (
      select 'Mack' Name, sysdate-0.05 tt from dual 
      union all 
      select 'Mack' Name, sysdate-0.03 from dual 
      union all 
      select 'Mack' Name, sysdate-0.04 from dual 
      union all 
      select 'Angel' Name, sysdate-0.005 from dual    
      ) 
select name, min(tt), max(tt), (max(tt) - min(tt)) * 24 * 60, count(*) 
from t 
group by name 
having count(*) > 2 -- qnt of logins 
    and (max(tt) - min(tt)) * 24 * 60 > 20 -- interval 20 min