यदि मैं आपकी आवश्यकताओं को सही ढंग से समझता हूं, यदि यह ग्राफ़ उपयोगकर्ता गतिविधि का प्रतिनिधित्व करता है:
Day
12/1 12/2 12/3 12/4 ...
Hour 0 xx x x xx
1 x xx xx
2 xxx x x xx
3 x x
4 x x
5 x x
6 x
...
आप जानना चाहते हैं कि 02:00 उच्चतम औसत गतिविधि वाला दिन का समय है (7 x
वाली एक पंक्ति) ), और 12/4 सबसे सक्रिय दिन था (10 x
. वाला एक कॉलम ) ध्यान दें कि इसका मतलब यह नहीं है कि 12/4 का 02:00 अब तक का सबसे सक्रिय घंटा था, जैसा कि आप उदाहरण में देख सकते हैं। यदि यह वह नहीं है जो आप चाहते हैं तो कृपया इनपुट और वांछित परिणाम के ठोस उदाहरणों के साथ स्पष्ट करें।
हम कुछ धारणाएँ बनाते हैं:
- एक गतिविधि रिकॉर्ड एक तारीख को शुरू हो सकता है और अगली तारीख को खत्म हो सकता है। उदाहरण के लिए:ऑनलाइन
2013-12-02 23:35
, ऑफ़लाइन2013-12-03 00:13
। - किसी भी गतिविधि रिकॉर्ड की अवधि 23 घंटे से अधिक नहीं है, या ऐसे रिकॉर्ड की संख्या नगण्य है।
और हमें यह परिभाषित करने की आवश्यकता है कि 'गतिविधि' का क्या अर्थ है। मैंने उन मानदंडों को चुना जो प्रत्येक मामले में गणना करना आसान था। अधिक जटिल प्रश्नों की कीमत पर, यदि आवश्यक हो तो दोनों को अधिक सटीक बनाया जा सकता है।
- दिन का सबसे सक्रिय समय वह घंटा होगा जिसके साथ अधिक गतिविधि रिकॉर्ड ओवरलैप होते हैं। ध्यान दें कि यदि कोई उपयोगकर्ता घंटे के दौरान एक से अधिक बार शुरू और बंद करता है तो इसे एक से अधिक बार गिना जाएगा।
- सबसे सक्रिय दिन वह होगा जिसके लिए अधिक अद्वितीय उपयोगकर्ता थे जो दिन के किसी भी समय सक्रिय थे।
दिन के सबसे सक्रिय समय के लिए हम 24 संभावित घंटों को रखने वाली एक छोटी सहायक तालिका का उपयोग करेंगे। इसे अन्य उत्तरों में वर्णित तकनीकों के साथ उत्पन्न किया जा सकता है और मक्खी पर भी जोड़ा जा सकता है।
CREATE TABLE hour ( hour tinyint not null, primary key(hour) );
INSERT hour (hour)
VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)
, (11), (12), (13), (14), (15), (16), (17), (18), (19), (20)
, (21), (22), (23);
फिर निम्नलिखित प्रश्न आवश्यक परिणाम देते हैं:
SELECT hour, count(*) AS activity
FROM steamonlineactivity, hour
WHERE ( hour BETWEEN hour(online) AND hour(offline)
OR hour(online) BETWEEN hour(offline) AND hour
OR hour(offline) BETWEEN hour AND hour(online) )
GROUP BY hour
ORDER BY activity DESC;
SELECT date, count(DISTINCT userID) AS activity
FROM (
SELECT userID, date(online) AS date
FROM steamonlineactivity
UNION
SELECT userID, date(offline) AS date
FROM steamonlineactivity
) AS x
GROUP BY date
ORDER BY activity DESC;