आपकी क्वेरी गैर नियतात्मक है इसलिए यह आश्चर्यजनक नहीं है कि आपको अप्रत्याशित परिणाम मिल रहे हैं। इससे मेरा मतलब है कि आप इस क्वेरी को एक ही डेटा पर 5 बार चला सकते हैं और 5 अलग-अलग परिणाम सेट प्राप्त कर सकते हैं। यह इस तथ्य के कारण है कि आप DATE(timestamp)
. का चयन कर रहे हैं लेकिन WEEK(DATE(startdate))
. के अनुसार समूहीकृत करना , इसलिए क्वेरी किसी भी में प्रति प्रारंभ दिनांक सप्ताह में आने वाली पहली पंक्ति का समय लौटा रही है आदेश।
निम्नलिखित 2 पंक्तियों पर विचार करें (पढ़ने में आसानी के लिए दिनांक प्रारूप में टाइमस्टैम्प के साथ):
TimeStamp StartDate
20120601 20120601
20120701 20120601
आपकी क्वेरी WEEK(StartDate)
. के अनुसार समूहीकृत की जा रही है जो कि 23 है, क्योंकि दोनों पंक्तियों का मूल्यांकन एक ही मान पर होता है, आप उम्मीद करेंगे कि आपके परिणामों में 2 की गिनती के साथ 1 पंक्ति होगी।
हालांकि DATE(Timestamp)
चयन सूची में भी है और चूंकि कोई ORDER BY
नहीं है कथन क्वेरी को पता नहीं है कि कौन सा टाइमस्टैम्प '20120601' या '20120701' लौटाएगा। तो इस छोटे से परिणाम सेट पर भी आपके पास प्राप्त करने का 50:50 मौका है:
TimeStamp COUNT
20120601 2
और प्राप्त करने का 50:50 मौका
TimeStamp COUNT
20120701 2
यदि आप डेटासेट में इस प्रकार अधिक डेटा जोड़ते हैं:
TimeStamp StartDate
20120601 20120601
20120701 20120601
20120701 20120701
आप प्राप्त कर सकते हैं
TimeStamp COUNT
20120601 2
20120701 1
या
TimeStamp COUNT
20120701 2
20120701 1
आप देख सकते हैं कि कैसे 37,000,000 पंक्तियों के साथ आपको जल्द ही ऐसे परिणाम मिलेंगे जिनकी आपको उम्मीद नहीं है और जिनका आप अनुमान नहीं लगा सकते हैं!
संपादित करें
चूंकि ऐसा लगता है कि आप अपने परिणामों में सप्ताह की शुरुआत प्राप्त करने का प्रयास कर रहे हैं, जबकि सप्ताह के आधार पर समूह आप सप्ताह की शुरुआत करने के लिए निम्नलिखित का उपयोग कर सकते हैं (CURRENT_TIMESTAMP को आप जो भी कॉलम चाहते हैं उसे बदलकर):
SELECT DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 - DAYOFWEEK(CURRENT_TIMESTAMP) DAY) AS WeekStart
फिर आप साप्ताहिक परिणाम प्राप्त करने के लिए इस तिथि तक समूह बना सकते हैं और अपनी चयन सूची में ऐसी चीजें रखने की परेशानी से बच सकते हैं जो आपके समूह में नहीं हैं।