sql >> Database >  >> RDS >> Mysql

Tel het aantal rijen die niet binnen 10 seconden van elkaar liggen

Laat ik beginnen met deze tabel. Ik gebruik gewone tijdstempels zodat we gemakkelijk kunnen zien wat er aan de hand is.

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

Als ik je goed begrijp, wil je deze op deze manier tellen.

180.2.79.3   3
180.2.79.4   3

U kunt dat voor elk ip_adres doen door het maximale tijdstempel te selecteren dat beide is

  • groter dan de tijdstempel van de huidige rij, en
  • minder dan of gelijk aan 10 seconden langer dan de tijdstempel van de huidige rij.

Door deze twee criteria samen te nemen, worden enkele nullen geïntroduceerd, die erg nuttig blijken te zijn.

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>

Het tijdstempel dat het einde van een bezoek markeert, heeft een null voor zijn eigen next_page. Dat komt omdat geen enkele tijdstempel kleiner is dan of gelijk is aan time_stamp + 10 seconden voor die rij.

Om een ​​telling te krijgen, zou ik waarschijnlijk een weergave maken en de nulls tellen.

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. mysql bestel varchar-veld als geheel getal

  2. PHP MySql (1045) Toegang geweigerd voor gebruiker

  3. SQLite niet zo'n kolom

  4. Is een normale MySql-index vereist als we een samengestelde index hebben?