फॉर्म में वेबसाइट एक्सेस डेटा session_id, ip, user_agent
, और वैकल्पिक रूप से टाइमस्टैम्प को देखते हुए , नीचे दी गई शर्तों का पालन करते हुए, आप अद्वितीय आगंतुकों में सत्रों को कैसे क्लस्टर करेंगे?
session_id
: हर नए आगंतुक को एक आईडी दी जाती है। यह समाप्त नहीं होता है, हालांकि अगर उपयोगकर्ता कुकीज़ को स्वीकार नहीं करता है / कुकीज़ / परिवर्तन ब्राउज़र / परिवर्तन डिवाइस को साफ़ करता है, तो वह अब नहीं होगा
IP
विभिन्न उपयोगकर्ताओं के बीच साझा किया जा सकता है (एक मुफ्त वाई-फाई कैफे, या आपके आईएसपी पुन: असाइन किए गए आईपी की कल्पना करें), और उनके पास अक्सर कम से कम 2, घर और काम होंगे।
User_agent
ब्राउज़र + OS संस्करण है, जो उपकरणों के बीच अंतर करने की अनुमति देता है। उदाहरण के लिए एक उपयोगकर्ता फोन और लैपटॉप दोनों का उपयोग करने की संभावना रखता है, लेकिन विंडोज़ + ऐप्पल लैपटॉप का उपयोग करने की संभावना नहीं है। यह संभावना नहीं है कि एक ही सत्र आईडी में कई उपयोगकर्ता हैं।
डेटा यहाँ फ़ेडल के रूप में दिख सकता है: http://sqlfiddle.com/#/2/c4de40/1
बेशक, हम मान्यताओं के बारे में बात कर रहे हैं, लेकिन यह यथासंभव वास्तविकता के करीब होने के बारे में है। उदाहरण के लिए, यदि हम एक ही ip और useragent को एक सीमित समय सीमा में एक अलग सेशन_आईडी के साथ सामना करते हैं, तो यह एक उचित धारणा होगी कि यह एक ही उपयोगकर्ता है, जिसमें कुछ एज केस अपवाद हैं।
संपादित करें: जिस भाषा में समस्या हल हो गई है वह irellevant है, यह अधिकतर तर्क के बारे में है और कार्यान्वयन नहीं है। स्यूडोकोड ठीक है।
संपादित करें: फिडेल की धीमी प्रकृति के कारण, आप वैकल्पिक रूप से 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