З огляду на дані про доступ до веб-сайтів у формі session_id, ip, user_agent
та, можливо, часову позначку, дотримуючись наведених нижче умов, як ви найкраще класифікувати сеанси в унікальних відвідувачів?
session_id
: - це ідентифікатор, який надається кожному новому відвідувачеві. Він не закінчується, проте якщо користувач не приймає файли cookie / очищення файлів cookie / зміни браузера / зміни пристрою, він більше не буде розпізнаний
IP
їх можна ділитися між різними користувачами (уявіть собі безкоштовне кафе Wi-Fi або ваш Інтернет-провайдер, який переставляє IP-адреси), і вони часто матимуть як мінімум 2 дому та роботи.
User_agent
- це версія браузера + ОС, що дозволяє розрізняти пристрої. Наприклад, користувач, швидше за все, буде використовувати телефон і ноутбук, але навряд чи використовувати Windows + Apple ноутбуки. Навряд чи той самий ідентифікатор сеансу має кілька користувачів.
Дані можуть виглядати як загадка тут: http://sqlfiddle.com/#!2/c4de40/1
Звичайно, ми говоримо про припущення, але мова йде про наближення до реальності, наскільки це можливо. Наприклад, якщо ми зустрічаємо одних і тих же ip та useragent у обмежені часові рамки з іншим session_id, було б справедливим припущенням, що це той самий користувач, за винятком кращих випадків.
Редагувати: мова, якою вирішується проблема, є невиправданою, здебільшого мова йде про логіку, а не про реалізацію. Псевдокод - це добре.
Редагувати: через повільний характер загадки ви можете альтернативно читати / запускати 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