Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Policz liczbę rzędów, które nie są od siebie oddalone o 10 sekund

Zacznę od tego stołu. Użyję zwykłych znaczników czasu, abyśmy mogli łatwo zobaczyć, co się dzieje.

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

Jeśli dobrze cię rozumiem, chcesz je liczyć w ten sposób.

180.2.79.3   3
180.2.79.4   3

Możesz to zrobić dla każdego adresu ip, wybierając maksymalny znacznik czasu, który jest obydwoma

  • większe niż sygnatura czasowa bieżącego wiersza i
  • mniejsze lub równe 10 sekund większe niż sygnatura czasowa bieżącego wiersza.

Połączenie tych dwóch kryteriów razem wprowadzi pewne wartości null, które okazują się naprawdę przydatne.

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>

Sygnatura czasowa oznaczająca koniec wizyty ma wartość null dla własnej next_page. Dzieje się tak, ponieważ żaden znacznik czasu nie jest mniejszy lub równy znacznikowi czasu + 10 sekund dla tego wiersza.

Aby uzyskać liczbę, prawdopodobnie utworzyłbym widok i policzył wartości null.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Synchronizacja danych między MySQL i MongoDB

  2. Błąd podczas próby zainstalowania aplikacji z mysql2 gem

  3. Mysql:wykonanie polecenia odrzuconego użytkownikowi ''@'localhost' z powodu rutynowego błędu

  4. hibernacja mapy java Long do błędu BIGINT MySQL

  5. zapytanie mysql - formatowanie daty na wyjściu?