我在Oracle 11g中有一个表LOGIN_DETAILS
,其中保留了每次登录后用户的详细信息。我想获取在任何30分钟间隔内完成超过5次登录的用户的名称。
示例:
考虑以下记录:
在上述记录中,MACK在07-08-17 05:10:17和07-08-17 05:40:17之间进行了6次登录,这是在间隔的30分钟内。 因此查询应该返回名称“MACK”作为输出。
注意:30分钟的间隔未预先定义,也就是说未定义30分钟的间隔应该开始。
提前致谢。
答案 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条记录,因为当前记录是第五条记录。