जहां तक ​​मेरी जानकारी है, SELECT कथन में यादृच्छिक मान प्राप्त करने का एकमात्र तरीका newid() फ़ंक्शन का उपयोग करना है, क्योंकि random() फ़ंक्शन प्रत्येक के लिए नए मान उत्पन्न नहीं करता है पंक्ति।

यह 0 - 9 से यादृच्छिक संख्या प्राप्त करने के लिए निम्नलिखित अजीब निर्माण की ओर जाता है:

abs(checksum(newid())) % 10

अगर मैं इस अभिव्यक्ति का उपयोग SELECT खंड में करता हूं, तो यह अपेक्षा के अनुरूप व्यवहार करता है। हालांकि, अगर मैं निम्नलिखित की तरह कुछ कोशिश करता हूं:

select *
from table
where abs(checksum(newid())) % 10>4;

मुझे हालांकि यह होना चाहिए था कि मुझे लगभग आधी पंक्तियाँ मिल जाएँगी। इसके बजाय मुझे मिलता है मुझे उनमें से सभी या कोई नहीं मिलता है। स्पष्ट रूप से newid() का मूल्यांकन प्रत्येक पंक्ति के बजाय केवल एक बार किया जाता है।

प्रश्न यह है कि मैं WHERE खंड में यादृच्छिक संख्या का उपयोग कैसे कर सकता हूं?

अधिक

एक समान प्रश्न है जो यादृच्छिक रूप से पंक्तियों की निश्चित संख्या के लिए पूछता है। उपरोक्त उदाहरण में मैं इस्तेमाल कर सकता था:

select top 50 percent from table order by newid();

जो मुझे वह मिलेगा जो मैं ढूंढ रहा हूं।

प्रश्न बना रहता है, मैं WHERE खंड में यादृच्छिक संख्या का उपयोग कैसे कर सकता हूं। उदाहरण के लिए, क्या ऐसा कुछ करना संभव है?

select *
from table
where code={random number};
3
Manngo 12 जुलाई 2017, 13:37
2
का संभावित डुप्लिकेट
 – 
underscore_d
12 जुलाई 2017, 13:41
1
संभावित आधा-डुप्लिकेट, मुझे लगता है, लेकिन सवाल विशेष रूप से यादृच्छिक पंक्तियों की एक निर्धारित संख्या चाहता है। यहां मैं पंक्तियों की एक चर संख्या की तलाश में हूं।
 – 
Manngo
12 जुलाई 2017, 13:52

2 जवाब

यहाँ समस्या से निजात पाने का एक तरीका है

SELECT *
FROM   (SELECT *,
               Abs(Checksum(Newid())) % 10 AS ran
        FROM   yourtable) a
WHERE  ran > 4; 

किसी कारण से newid() where क्लॉज में इसे केवल एक बार निष्पादित किया जाता है और इसे स्थिरांक से जांचा जाता है।

जब मैं निष्पादन योजना की जांच करता हूं तो आपकी क्वेरी गायब है compute scalar जहां मेरी क्वेरी में निष्पादन योजना में गणना स्केलर मौजूद है।

1
Pரதீப் 12 जुलाई 2017, 13:50

मुझे हालांकि यह होना चाहिए था कि मुझे लगभग आधी पंक्तियाँ मिल जाएँगी। इसके बजाय मुझे मिलता है मुझे उनमें से सभी या कोई भी नहीं मिलता है

आपको सभी पंक्तियाँ या उनमें से कोई भी नहीं मिल सकता है, क्योंकि NEWID () को प्रति क्वेरी एक बार निष्पादित किया जाता है, जब आप इसका उपयोग क्लॉज में करते हैं। इसे यहां कॉनर कनिगम द्वारा समझाया गया है और इसके लिए तकनीकी शब्द को RumTimeConstants

आप अपनी निष्पादन योजना को देख सकते हैं और नीचे दी गई अभिव्यक्ति को देख सकते हैं

कॉन्स्ट कॉन्स्ट वैल्यू

जिसे आप देख सकते हैं एक बार गणना की जाती है और पूरे उपयोग की जाती है और अंत में आप केवल एक बूलियन तुलना कर रहे हैं, इसलिए आप सभी पंक्तियों या किसी के साथ समाप्त हो जाएंगे

आपको सीटीई का उपयोग करना होगा जैसे किसी अन्य उत्तर में कहा गया है या यादृच्छिक पंक्तियों को वापस करने के लिए newid() या टेबल नमूना द्वारा ऑर्डर के साथ शीर्ष का उपयोग करें

आपको टेबल्स नमूना विकल्प अधिक उपयोगी लग सकता है, क्योंकि यह सभी तालिका डेटा पंक्तियों का केवल नमूना सेट प्राप्त करने के लिए नहीं जा सकता है, न्यूआईडी के विपरीत ()

1000000 पंक्तियों वाली तालिका पर एक उदाहरण नीचे दिया गया है

select *  from Orders
TABLESAMPLE (50 PERCENT)

योजना

enter image description here

0
TheGameiswar 12 जुलाई 2017, 14:32