sql >> Databasteknik >  >> RDS >> Mysql

Räkna antalet rader som inte ligger inom 10 sekunder från varandra

Låt mig börja med den här tabellen. Jag kommer att använda vanliga tidsstämplar så att vi enkelt kan se vad som händer.

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

Om jag förstår dig rätt vill du räkna dessa så här.

180.2.79.3   3
180.2.79.4   3

Du kan göra det för varje ip_adress genom att välja den maximala tidsstämpeln som är båda

  • större än den aktuella radens tidsstämpel, och
  • mindre än eller lika med 10 sekunder större än den aktuella radens tidsstämpel.

Att ta dessa två kriterier tillsammans kommer att introducera några nollor, som visar sig vara riktigt användbara.

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>

Tidsstämpeln som markerar slutet på ett besök har en noll för sin egen nästa_sida. Det beror på att ingen tidsstämpel är mindre än eller lika med time_stamp + 10 sekunder för den raden.

För att få en räkning skulle jag förmodligen skapa en vy och räkna nollorna.

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. NULL vs. "oändlighet" i PostgreSQL-intervalltyper

  2. Vad är det bästa sättet att lagra mediefiler i en databas?

  3. 5 sätt att implementera skiftlägeskänslig sökning i SQLite med fullt Unicode-stöd

  4. JavaScript Bekräfta före radering med PHP/MYSQL