sql >> Database teknologi >  >> RDS >> Mysql

Tæl antallet af rækker, der ikke er inden for 10 sekunder fra hinanden

Lad mig starte med denne tabel. Jeg bruger almindelige tidsstempler, så vi nemt kan se, hvad der sker.

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

Hvis jeg forstår dig rigtigt, vil du tælle disse sådan her.

180.2.79.3   3
180.2.79.4   3
 

Du kan gøre det for hver ip_adresse ved at vælge det maksimale tidsstempel, der er både

  • større end den aktuelle rækkes tidsstempel, og
  • mindre end eller lig med 10 sekunder større end den aktuelle rækkes tidsstempel.

At tage disse to kriterier sammen vil introducere nogle nuller, som viser sig at være virkelig nyttige.

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>
 

Tidsstemplet, der markerer afslutningen på et besøg, har en nulværdi for sin egen next_page. Det skyldes, at intet tidsstempel er mindre end eller lig med time_stamp + 10 sekunder for den pågældende række.

For at få en optælling ville jeg nok oprette en visning og tælle nullerne.

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
 


  1. STOR fejl uden for rækkevidde siden MySQL 5.5

  2. PHP 5.4 PDO kunne ikke oprette forbindelse til MySQL 4.1+ ved hjælp af den gamle usikre autentificering

  3. Find 2. højeste løn bedst mulige måder

  4. SQL-overvågning i SQL-udvikler