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