Dados os dados de acesso ao site no formulário session_id, ip, user_agent
e, opcionalmente, o carimbo de data / hora, seguindo as condições abaixo, como você agruparia melhor as sessões em visitantes únicos?
session_id
: é um ID fornecido a cada novo visitante. Ele não expira; no entanto, se o usuário não aceitar cookies / limpar cookies / alterar o navegador / alterar o dispositivo, ele não será mais reconhecido
IP
podem ser compartilhados entre diferentes usuários (imagine um café wi-fi gratuito ou o seu provedor de serviços de Internet), e eles geralmente terão pelo menos dois em casa e no trabalho.
User_agent
é a versão do navegador + do SO, permitindo distinguir entre dispositivos. Por exemplo, é provável que um usuário use telefone e laptop, mas é improvável que use laptops Windows + Apple. É improvável que o mesmo ID de sessão tenha vários agentes de usuário.
Os dados podem parecer o violino aqui: http://sqlfiddle.com/#!2/c4de40/1
É claro que estamos falando de suposições, mas é sobre chegar o mais próximo possível da realidade. Por exemplo, se encontrarmos o mesmo ip e useragent em um período de tempo limitado com um session_id diferente, seria uma suposição justa de que é o mesmo usuário, com algumas exceções de casos extremos.
Edit: O idioma em que o problema foi resolvido é irrelevante, principalmente sobre lógica e não implementação. Pseudocódigo está bom.
Edit: devido à natureza lenta do violino, você pode ler / executar o 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