2017-08-07 6 views
1

Ich habe eine Tabelle LOGIN_DETAILS in Oracle 11g, wo Details des Benutzers nach jeder Anmeldung beibehalten werden. Ich möchte den Namen des Benutzers abrufen, der mehr als 5 Logins innerhalb von 30 Minuten durchgeführt hat.Datensätze abrufen basierend auf Anzahl und innerhalb eines bestimmten Zeitintervalls

Beispiel:

Betrachten Sie folgende Aufzeichnungen:

enter image description here

In oben Aufzeichnungen hat MACK 6 Anmeldungen erfolgt innerhalb 07-08-17 05.10.17 und 07-08-17 05:40:17 das ist innerhalb von 30 Minuten Pause. Also sollte die Abfrage den Namen 'MACK' als Ausgabe zurückgeben.

Hinweis: 30 Minuten-Intervall wird nicht im Voraus festgelegt, dass es nicht aus definiert ist, waren 30 Minuten Intervall beginnen soll.

Vielen Dank im Voraus.

Antwort

1

Verwendung lag(). Im Folgenden wird die letzte Zeile, wenn 5 innerhalb von 30 Minuten:

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; 

Beachten Sie, dass die lag() zurück 4 Aufzeichnungen geht, weil der aktuelle Datensatz der fünfte ist.

1

etwas wie die

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 
Verwandte Themen