2009-04-09 13 views
45

This question एक यादृच्छिक (ish) अभिलेखों के SQL सर्वर पर नमूना करने के बारे में पूछता है से परिणाम के बेतरतीब नमूने का चयन करें और जवाब TABLESAMPLE उपयोग करने के लिए किया गया था। क्या ओरेकल 10 में बराबर है?एक प्रश्न परिणाम

अगर वहाँ नहीं है, वहाँ एक प्रश्न से परिणाम के बेतरतीब नमूने सेट प्राप्त करने के लिए एक मानक तरीका है? उदाहरण के लिए, एक प्रश्न से 1,000 यादृच्छिक पंक्तियां कैसे प्राप्त कर सकती हैं जो सामान्य रूप से लाखों लौटेगी?

+4

इस बिंदु पर, @grokster के पास एक चेक किए गए से बेहतर जवाब है। –

उत्तर

64
SELECT * 
FROM (
     SELECT * 
     FROM mytable 
     ORDER BY 
       dbms_random.value 
     ) 
WHERE rownum <= 1000 
+3

थोड़ा धीमा, लेकिन नौकरी करता है, धन्यवाद। –

+13

DBMS_RANDOM पीएल/एसक्यूएल है, और यादृच्छिक संख्या उत्पन्न करने के लिए ओरेकल में कोई शुद्ध SQL तरीका नहीं है। सभी जय संदर्भ संदर्भ। – Quassnoi

9

वहाँ भी एक विशेष नमूना खंड एक प्रतिशत का चयन करने के लिए है: http://oracleact.com/papers/sampleclause.html

+1

यह एक टेबल पर काम करता है, लेकिन @op 'क्वेरी सेट' के लिए पूछता है, और नमूना एक क्वेरी सेट के लिए लागू नहीं होता है, केवल एक जोड़े में अलग-अलग तालिकाओं के लिए। संदर्भ के लिए +1, फिर भी। – Quassnoi

+0

दरअसल यह मेरी आवश्यकताओं के अनुरूप बेहतर है। ऐसा लगता है कि इसे ऑरैकल 10 में कई तालिकाओं के लिए भी इस्तेमाल किया जा सकता है, लेकिन क्वास्नोई के समाधान ने मुझे जो कुछ भी चाहिए और मिनटों में जवाब दिया, इसलिए वह टिक टिकता है :) –

0

कुछ इस तरह काम करना चाहिए:

SELECT * 
FROM table_name 
WHERE primary_key IN (SELECT primary_key 
         FROM 
         (
         SELECT primary_key, SYS.DBMS_RANDOM.RANDOM 
         FROM table_name 
         ORDER BY 2 
        ) 
         WHERE rownum <= 10); 
51

SAMPLE clause आप में सभी पंक्तियों के बेतरतीब नमूने प्रतिशत दे देंगे मेज़।

SELECT * FROM emp SAMPLE(25) 

निम्नलिखित एसक्यूएल (विश्लेषणात्मक कार्यों में से एक का उपयोग कर) यदि आप किसी विशेष के प्रत्येक घटना की एक विशिष्ट संख्या के बेतरतीब नमूने दे देंगे:

उदाहरण के लिए, यहाँ हम पंक्तियों का 25% प्राप्त एक तालिका में मान (ग्रुप बाय के समान)।

यहाँ हम नमूना प्रत्येक के 10:

SELECT * FROM (
SELECT job, sal, ROW_NUMBER() 
OVER (
PARTITION BY job ORDER BY job 
) SampleCount FROM emp 
) 
WHERE SampleCount <= 10 
+0

हमें ज्यादातर समय पंक्तियों का 25% नहीं मिलता है। इसके बजाय हमें कुछ अनिश्चित पंक्तियां मिलती हैं। और हमारे मूल सेट से प्रत्येक पंक्ति में चयनित होने का एक ही मौका (¼ यहां) है। –

0

हम दिए गए थे और काम एक सप्ताह के आदि काल में प्रत्येक एजेंट के लिए agents..ie 2 यादृच्छिक रिकॉर्ड की सूची में से केवल दो रिकॉर्ड चयन करने के लिए ... और नीचे हमें मिला है और यह

with summary as (
Select Dbms_Random.Random As Ran_Number, 
      colmn1, 
      colm2, 
      colm3 
      Row_Number() Over(Partition By col2 Order By Dbms_Random.Random) As Rank 
    From table1, table2 
Where Table1.Id = Table2.Id 
Order By Dbms_Random.Random Asc) 
Select tab1.col2, 
      tab1.col4, 
      tab1.col5, 
    From Summary s 
Where s.Rank <= 2; 
10

यह एक सही उत्तर नहीं है लेकिन बेहतर प्रदर्शन प्राप्त करेगा।

SELECT * 
FROM (
    SELECT * 
    FROM mytable sample (0.01) 
    ORDER BY 
      dbms_random.value 
    ) 
WHERE rownum <= 1000 

नमूना आप अपने वास्तविक तालिका का एक प्रतिशत दे देंगे, यदि आप वास्तव में एक 1000 पंक्तियों आपको लगता है कि संख्या को समायोजित करने की आवश्यकता होगी चाहते थे। वैसे भी मुझे सिर्फ पंक्तियों की मनमानी संख्या की आवश्यकता होती है, इसलिए मैं अपने परिणामों को सीमित नहीं करता हूं। मेरे डेटाबेस पर 2 मिलियन पंक्तियों के साथ मुझे 2 सेकंड बनाम 60 सेकंड मिलते हैं।

select * from mytable sample (0.01) 
1

नमूना फ़ंक्शन का उपयोग ORACLE में नमूना डेटा के लिए किया जाता है। तो आप इस तरह से कोशिश कर सकते हैं: -

SELECT * FROM TABLE_NAME SAMPLE(50); 

यहां 50 तालिका द्वारा निहित डेटा का प्रतिशत है। तो अगर आप 1000 पंक्तियों 100000 से आप की तरह एक प्रश्न पर अमल कर सकते हैं: -

SELECT * FROM TABLE_NAME SAMPLE(1); 

आशा यह आप कर सकते हैं।

4
SELECT * FROM TABLE_NAME SAMPLE(1) 

आपको अवलोकन की संख्या के 1/100 के बजाय लगभग 1% हिस्सा देगा। संभावित कारण यह है कि ओरेकल प्रत्येक अवलोकन के लिए एक यादृच्छिक ध्वज उत्पन्न करता है कि इसमें उत्पन्न नमूने में शामिल है या नहीं। ऐसी पीढ़ी की प्रक्रिया में तर्क 1 (1%) प्रत्येक अवलोकन के नमूने में चुने जाने की संभावना की भूमिका निभाता है।

अगर यह सही है, नमूना आकार के वास्तविक वितरण द्विपद हो जाएगा।

+0

दुरुपयोग स्वरूपण के लिए खेद है। मैं प्रकोप करने का प्रयास करूंगा। – Hors2force

2

मैं यह पहले से ही उत्तर दिया गया है, लेकिन यहां तो कई का दौरा देखकर मैं एक संस्करण नमूना खंड का उपयोग करता है, लेकिन अभी भी पहली पंक्तियों को फ़िल्टर करने की अनुमति देता है कि जोड़ना चाहते हैं पता है:

with cte1 as (
    select * 
    from t_your_table 
    where your_column = 'ABC' 
) 
select * from cte1 sample (5) 

नोट तथापि कि बेस चयन को ROWID कॉलम की आवश्यकता होती है, जिसका अर्थ है कि यह उदाहरण के लिए कुछ विचारों के लिए काम नहीं कर सकता है।

संबंधित मुद्दे