Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zählen Sie die Anzahl der Zeilen, die nicht innerhalb von 10 Sekunden voneinander entfernt sind

Lassen Sie mich mit dieser Tabelle beginnen. Ich werde gewöhnliche Zeitstempel verwenden, damit wir leicht sehen können, was vor sich geht.

180.2.79.3   2011-01-01 08:00:00
180.2.79.3   2011-01-01 08:00:09
180.2.79.3   2011-01-01 08:00:20
180.2.79.3   2011-01-01 08:00:23
180.2.79.3   2011-01-01 08:00:25
180.2.79.3   2011-01-01 08:00:40
180.2.79.4   2011-01-01 08:00:00
180.2.79.4   2011-01-01 08:00:13
180.2.79.4   2011-01-01 08:00:23
180.2.79.4   2011-01-01 08:00:25
180.2.79.4   2011-01-01 08:00:27
180.2.79.4   2011-01-01 08:00:29
180.2.79.4   2011-01-01 08:00:50

Wenn ich dich richtig verstehe, willst du diese so zählen.

180.2.79.3   3
180.2.79.4   3

Sie können dies für jede IP-Adresse tun, indem Sie den maximalen Zeitstempel auswählen, der beides ist

  • größer als der Zeitstempel der aktuellen Zeile und
  • weniger als oder gleich 10 Sekunden größer als der Zeitstempel der aktuellen Zeile.

Wenn Sie diese beiden Kriterien zusammennehmen, werden einige Nullen eingeführt, die sich als sehr nützlich erweisen.

select ip_address, 
       t_s.time_stamp, 
       (select max(t.time_stamp) 
        from t_s t 
        where t.ip_address = t_s.ip_address 
          and t.time_stamp > t_s.time_stamp
          and t.time_stamp - t_s.time_stamp <= interval '10' second) next_page
from t_s 
group by ip_address, t_s.time_stamp
order by ip_address, t_s.time_stamp;

ip_address   time_stamp            next_page
180.2.79.3   2011-01-01 08:00:00   2011-01-01 08:00:09
180.2.79.3   2011-01-01 08:00:09   <null>
180.2.79.3   2011-01-01 08:00:20   2011-01-01 08:00:25
180.2.79.3   2011-01-01 08:00:23   2011-01-01 08:00:25
180.2.79.3   2011-01-01 08:00:25   <null>
180.2.79.3   2011-01-01 08:00:40   <null>
180.2.79.4   2011-01-01 08:00:00   <null>
180.2.79.4   2011-01-01 08:00:13   2011-01-01 08:00:23
180.2.79.4   2011-01-01 08:00:23   2011-01-01 08:00:29
180.2.79.4   2011-01-01 08:00:25   2011-01-01 08:00:29
180.2.79.4   2011-01-01 08:00:27   2011-01-01 08:00:29
180.2.79.4   2011-01-01 08:00:29   <null>
180.2.79.4   2011-01-01 08:00:50   <null>

Der Zeitstempel, der das Ende eines Besuchs markiert, hat eine Null für seine eigene next_page. Das liegt daran, dass kein Zeitstempel kleiner oder gleich time_stamp + 10 Sekunden für diese Zeile ist.

Um eine Zählung zu erhalten, würde ich wahrscheinlich eine Ansicht erstellen und die Nullen zählen.

select ip_address, count(*)
from t_s_visits 
where next_page is null
group by ip_address

180.2.79.3   3
180.2.79.4   3