基于计数和在一定时间间隔内获取记录

时间:2017-08-07 13:19:59

标签: sql oracle group-by timestamp

我在Oracle 11g中有一个表LOGIN_DETAILS,其中保留了每次登录后用户的详细信息。我想获取在任何30分钟间隔内完成超过5次登录的用户的名称。

示例:

考虑以下记录:

enter image description here

在上述记录中,MACK在07-08-17 05:10:17和07-08-17 05:40:17之间进行了6次登录,这是在间隔的30分钟内。 因此查询应该返回名称“MACK”作为输出。

  

注意:30分钟的间隔未预先定义,也就是说未定义30分钟的间隔应该开始。

提前致谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

使用lag()。以下是30分钟内有5个时的最后一行:

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条记录,因为当前记录是第五条记录。

相关问题