Mysql
 sql >> Base de données >  >> RDS >> Mysql

Compter le nombre de lignes qui ne sont pas à moins de 10 secondes les unes des autres

Permettez-moi de commencer par ce tableau. J'utiliserai des horodatages ordinaires pour que nous puissions facilement voir ce qui se passe.

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

Si je vous comprends bien, vous voulez les compter comme ça.

180.2.79.3   3
180.2.79.4   3

Vous pouvez le faire pour chaque adresse IP en sélectionnant l'horodatage maximal qui est à la fois

  • supérieur à l'horodatage de la ligne actuelle, et
  • inférieur ou égal à 10 secondes de plus que l'horodatage de la ligne actuelle.

La combinaison de ces deux critères introduira des valeurs nulles, qui s'avèrent très utiles.

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>

L'horodatage qui marque la fin d'une visite a une valeur nulle pour sa propre page_suivante. C'est parce qu'aucun horodatage n'est inférieur ou égal à time_stamp + 10 secondes pour cette ligne.

Pour obtenir un décompte, je créerais probablement une vue et compterais les valeurs nulles.

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