जहां तक मेरी जानकारी है, 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};
2 जवाब
यहाँ समस्या से निजात पाने का एक तरीका है
SELECT *
FROM (SELECT *,
Abs(Checksum(Newid())) % 10 AS ran
FROM yourtable) a
WHERE ran > 4;
किसी कारण से newid()
where
क्लॉज में इसे केवल एक बार निष्पादित किया जाता है और इसे स्थिरांक से जांचा जाता है।
जब मैं निष्पादन योजना की जांच करता हूं तो आपकी क्वेरी गायब है compute scalar
जहां मेरी क्वेरी में निष्पादन योजना में गणना स्केलर मौजूद है।
मुझे हालांकि यह होना चाहिए था कि मुझे लगभग आधी पंक्तियाँ मिल जाएँगी। इसके बजाय मुझे मिलता है मुझे उनमें से सभी या कोई भी नहीं मिलता है
आपको सभी पंक्तियाँ या उनमें से कोई भी नहीं मिल सकता है, क्योंकि NEWID () को प्रति क्वेरी एक बार निष्पादित किया जाता है, जब आप इसका उपयोग क्लॉज में करते हैं। इसे यहां कॉनर कनिगम द्वारा समझाया गया है और इसके लिए तकनीकी शब्द को RumTimeConstants
आप अपनी निष्पादन योजना को देख सकते हैं और नीचे दी गई अभिव्यक्ति को देख सकते हैं
कॉन्स्ट कॉन्स्ट वैल्यू
जिसे आप देख सकते हैं एक बार गणना की जाती है और पूरे उपयोग की जाती है और अंत में आप केवल एक बूलियन तुलना कर रहे हैं, इसलिए आप सभी पंक्तियों या किसी के साथ समाप्त हो जाएंगे
आपको सीटीई का उपयोग करना होगा जैसे किसी अन्य उत्तर में कहा गया है या यादृच्छिक पंक्तियों को वापस करने के लिए newid() या टेबल नमूना द्वारा ऑर्डर के साथ शीर्ष का उपयोग करें
आपको टेबल्स नमूना विकल्प अधिक उपयोगी लग सकता है, क्योंकि यह सभी तालिका डेटा पंक्तियों का केवल नमूना सेट प्राप्त करने के लिए नहीं जा सकता है, न्यूआईडी के विपरीत ()
1000000 पंक्तियों वाली तालिका पर एक उदाहरण नीचे दिया गया है
select * from Orders
TABLESAMPLE (50 PERCENT)
योजना
संबंधित सवाल
नए सवाल
sql-server
Microsoft SQL सर्वर एक रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) है। कॉम्पैक्ट, एक्सप्रेस, एज़्योर, फास्ट-ट्रैक, एपीएस (पूर्व में पीडीडब्ल्यू) और एज़्योर SQL डीडब्ल्यू सहित सभी SQL सर्वर संस्करणों के लिए इस टैग का उपयोग करें। अन्य प्रकार के DBMS (MySQL, PostgreSQL, Oracle, आदि) के लिए इस टैग का उपयोग न करें। सॉफ़्टवेयर और मोबाइल विकास के मुद्दों के लिए इस टैग का उपयोग न करें, जब तक कि यह सीधे डेटाबेस से संबंधित न हो।