Dati i dati di accesso al sito Web nel modulo session_id, ip, user_agent
e, facoltativamente, il timestamp, seguendo le condizioni seguenti, come sarebbe meglio raggruppare le sessioni in visitatori unici?
session_id
: è un ID assegnato a ogni nuovo visitatore. Non scade, tuttavia se l'utente non accetta i cookie / cancella i cookie / cambia il browser / cambia il dispositivo, non verrà più riconosciuto
IP
possono essere condivisi tra diversi utenti (immagina un caffè wi-fi gratuito o il tuo ISP che riassegna gli IP) e spesso avranno almeno 2, a casa e al lavoro.
User_agent
è la versione browser + sistema operativo, che consente di distinguere tra dispositivi. Ad esempio, è probabile che un utente utilizzi sia il telefono che il laptop, ma è improbabile che utilizzi Windows + laptop Apple. È improbabile che lo stesso ID di sessione abbia più useragent.
I dati potrebbero apparire come il violino qui: http://sqlfiddle.com/#!2/c4de40/1
Certo, stiamo parlando di ipotesi, ma si tratta di avvicinarsi il più possibile alla realtà. Ad esempio, se incontriamo lo stesso ip e useragent in un periodo di tempo limitato con un session_id diverso, sarebbe ragionevole supporre che si tratti dello stesso utente, con alcune eccezioni edge case.
Modifica: la lingua in cui viene risolto il problema è irrilevante, riguarda principalmente la logica e non l'implementazione. Lo pseudocodice va bene.
Modifica: a causa della natura lenta del violino, puoi alternativamente leggere / eseguire il 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