मुझे लगता है कि समस्या यह है कि HAVING को GROUP BY के बाद लागू किया जाता है, लेकिन फिर भी SELECT चरण से पहले। मुझे एहसास है कि यह भ्रमित है क्योंकि HAVING क्लॉज SELECT कथन से एक कॉलम का संदर्भ देता है, लेकिन मुझे लगता है कि यह मूल रूप से केवल दो बार चयन कथन में जो कुछ भी है उसे निष्पादित करता है - एक बार होने के लिए, और फिर चयन के लिए।
उदाहरण के लिए, देखें यह जवाब ।
ध्यान दें, यह विशेष रूप से भ्रमित करने वाला है क्योंकि यदि आप किसी ऐसे कॉलम नाम का उल्लेख करते हैं जो HAVING क्लॉज में SELECT स्टेटमेंट में दिखाई नहीं देता है, तो यह एक त्रुटि देगा।
उदाहरण के लिए, this fiddle
लेकिन ऊपर दिए गए उस पहेली के अनुसार, यह अभी भी आपको उस फ़ंक्शन के परिणाम के आधार पर वास्तव में फ़िल्टर करने देगा जो आउटपुट में प्रकट नहीं होता है। लंबी कहानी छोटी, HAVING क्लॉज अभी भी वही कर रहा है जो आप चाहते हैं, लेकिन आप दोनों यादृच्छिक मान पर फ़िल्टर नहीं कर सकते हैं और उस दृष्टिकोण का उपयोग करके इसे एक ही समय में प्रदर्शित नहीं कर सकते हैं। यदि आपको ऐसा करने की ज़रूरत है, तो आपको पहले मान को ठीक करने के लिए एक सबक्वायरी का उपयोग करने की आवश्यकता है, फिर बाहरी क्वेरी फ़िल्टर कर सकती है और उस पर प्रदर्शित हो सकती है।
साथ ही, इसे स्पष्ट करने के लिए, संभवतः केवल खंड में रैंड() का उपयोग करना उचित है, न कि SQL भाग। हालांकि मुझे लगता है कि यह सवाल पूछ रहा है क्यों यह विशेष रूप से समस्या को हल करने की कोशिश करने के बजाय ऐसा कर रहा है।