Dados los datos de acceso al sitio web en el formulario session_id, ip, user_agent
, y opcionalmente la marca de tiempo, siguiendo las condiciones a continuación, ¿cómo agruparía mejor las sesiones en visitantes únicos?
session_id
: es una identificación dada a cada nuevo visitante. No caduca, sin embargo, si el usuario no acepta cookies / borra cookies / cambia el navegador / cambia el dispositivo, ya no será reconocido
IP
se pueden compartir entre diferentes usuarios (imagine un café con wifi gratuito o su ISP reasignando IP), y a menudo tendrán al menos 2, hogar y trabajo.
User_agent
es la versión del navegador + SO, lo que permite distinguir entre dispositivos. Por ejemplo, es probable que un usuario use tanto el teléfono como la computadora portátil, pero es poco probable que use computadoras portátiles Windows + Apple. Es poco probable que la misma ID de sesión tenga múltiples agentes de uso.
Los datos pueden verse como el violín aquí: http://sqlfiddle.com/#!2/c4de40/1
Por supuesto, estamos hablando de suposiciones, pero se trata de acercarse lo más posible a la realidad. Por ejemplo, si encontramos la misma ip y useragent en un período de tiempo limitado con un session_id diferente, sería una suposición justa que es el mismo usuario, con algunas excepciones de casos extremos.
Editar: El lenguaje en el que se resuelve el problema es irrelevante, se trata principalmente de lógica y no de implementación. El pseudocódigo está bien.
Editar: debido a la naturaleza lenta del violín, también puede leer / ejecutar mysql:
select session_id, floor(rand()*256*256*256*256) as ip_num , floor(rand()*1000) as user_agent_id
from
(select 1+a.nr+10*b.nr as session_id, ceil(rand()*3) as nr
from
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)a
join
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)b
order by 1
)d
inner join
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 )e
on d.nr>=e.nr