Étant donné les données d'accès au site Web sous la forme session_id, ip, user_agent
, et éventuellement l'horodatage, en suivant les conditions ci-dessous, comment regrouperiez-vous au mieux les sessions en visiteurs uniques?
session_id
: est un identifiant donné à chaque nouveau visiteur. Il n'expire pas, mais si l'utilisateur n'accepte pas les cookies / efface les cookies / change de navigateur / change d'appareil, il ne sera plus reconnu
IP
peuvent être partagés entre différents utilisateurs (Imaginez un café wi-fi gratuit ou votre FAI réaffectant des IP), et ils en auront souvent au moins 2, à la maison et au travail.
User_agent
est la version navigateur + OS, permettant de distinguer les appareils. Par exemple, un utilisateur est susceptible d'utiliser à la fois un téléphone et un ordinateur portable, mais il est peu probable qu'il utilise des ordinateurs portables Windows + Apple. Il est peu probable que le même identifiant de session ait plusieurs agents utilisateurs.
Les données peuvent ressembler au violon ici: http://sqlfiddle.com/#!2/c4de40/1
Bien sûr, nous parlons d'hypothèses, mais il s'agit de se rapprocher le plus possible de la réalité. Par exemple, si nous rencontrons le même ip et useragent dans un laps de temps limité avec un session_id différent, ce serait une supposition juste qu'il s'agit du même utilisateur, à quelques exceptions près.
Edit: La langue dans laquelle le problème est résolu est irellevant, il s'agit principalement de logique et non d'implémentation. Le pseudocode est très bien.
Edit: en raison de la nature lente du violon, vous pouvez également lire / exécuter le 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