Hãy để tôi bắt đầu với bảng này. Tôi sẽ sử dụng dấu thời gian thông thường để chúng ta có thể dễ dàng xem những gì đang diễn ra.
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
Nếu tôi hiểu bạn đúng, bạn muốn đếm những thứ này như thế này.
180.2.79.3 3
180.2.79.4 3
Bạn có thể làm điều đó cho mỗi ip_address bằng cách chọn dấu thời gian tối đa cho cả hai
- lớn hơn dấu tối ưu của hàng hiện tại và
- nhỏ hơn hoặc lớn hơn 10 giây so với dấu thời gian của hàng hiện tại.
Kết hợp hai tiêu chí này với nhau sẽ giới thiệu một số null, hóa ra lại thực sự hữu ích.
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>
Dấu thời gian đánh dấu sự kết thúc của một lượt truy cập có giá trị rỗng cho next_page của chính nó. Đó là vì không có dấu thời gian nào nhỏ hơn hoặc bằng time_stamp + 10 giây cho hàng đó.
Để đếm, tôi có thể tạo một chế độ xem và đếm các giá trị rỗng.
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