2015-01-11 19 views
5

मेरे पास टेबल कहा जाता है जहां हम लोड परीक्षण के लिए 1 मिलियन प्रतिक्रिया समय संग्रहीत कर रहे हैं, अब हमें इस डेटा को 100 समूहों में विभाजित करने की आवश्यकता है यानी - पहले 500 रिकॉर्ड एक समूह के रूप में और इसी तरह, और गणना करें औसत के बजाए, प्रत्येक समूह का प्रतिशत।पोस्टग्रेज़ में प्रतिशतता की गणना कैसे करें

अब तक मैं इस क्वेरी

Select quartile 
    , avg(data) 
    , max(data) 
    FROM (

     SELECT data 
      , ntile(500) over (order by data) as quartile 
      FROM data 
     ) x 
GROUP BY quartile 
ORDER BY quartile 

कोशिश की, लेकिन मैं कैसे प्रतिशतक

उत्तर

6

ntile कैसे एक (गणना करता प्रतिशतक ऐसे चतुर्थक, दशमक के रूप में अन्य एन-टाइल्स, में से एक है लगता है की क्या ज़रूरत है, आदि।)।

ntile तालिका को निर्दिष्ट संख्या में जितनी संभव हो सके बाल्टी में समूहित करता है। यदि आपने 4 बाल्टी निर्दिष्ट की हैं, तो यह एक चतुर्भुज होगा। 10 एक डेसील होगा।

प्रतिशतक के लिए, आप बकेट की संख्या स्थापित होने के लिए 100

मैं सुनिश्चित नहीं हूं होगा जहां 500 यहाँ में आता है ... यदि आप यह निर्धारित करने के प्रतिशतक अपने डेटा है चाहता हूँ में (यानी 100 बाल्टी में जितना संभव हो उतना मिलियन समय विभाजित करें), आप ntile का उपयोग 100 के तर्क के साथ करेंगे, और समूहों में 500 से अधिक प्रविष्टियां होंगी।

यदि आपको avg और न ही max पर कोई परवाह नहीं है, तो आप अपनी क्वेरी से एक गुच्छा छोड़ सकते हैं। आमतौर पर

SELECT data, ntile(100) over (order by data) AS percentile 
FROM data 
ORDER BY data 
+0

प्रत्येक समूह में 500 रिकॉर्ड होते हैं, क्योंकि 100 समूह होंगे .. तो एनटीइल स्वचालित रूप से प्रतिशत की गणना करेगा? प्रत्येक समूह के लिए? – lampdev

+0

सुनिश्चित नहीं है कि "प्रत्येक समूह में 500 रिकॉर्ड हैं" का क्या मतलब है। क्या समूह? आपका सभी डेटा 'डेटा' तालिका में है। उस डेटा पर 'ntile (100) 'डेटा को 100 समूहों में बाल्टी करेगा, हालांकि कई पंक्तियां होंगी। और इस तरह किसी भी डेटा के किसी भी सेट के लिए प्रतिशत की गणना करेगा। यदि आपने इसे 500 समूहों में पहले तोड़ दिया है, तो यह अब प्रतिशत नहीं है ... – khampson

+0

हमें एक प्रतिशत ग्राफ को प्लॉट करने की आवश्यकता है जो कि एसी से अवरोही क्रम में जाता है ..table में 50,000 समय होते हैं, अब हमें इस 50, 000 समय को विभाजित करने की आवश्यकता है समूह और प्रत्येक समूह के लिए प्रतिशत गणना, मैं इस बारे में थोड़ा उलझन में हूँ। या हम इसे कैसे प्राप्त कर सकते हैं – lampdev

4

, यदि आप, प्रतिशतक जानना चाहता हूँ आप ntile से cume_dist का उपयोग कर सुरक्षित हैं: तो यह कुछ इस तरह दिखेगा। ऐसा इसलिए है क्योंकि ntile कुछ इनपुट दिए जाने पर अजीब तरीके से व्यवहार करता है। पर विचार करें:

=# select v, 
      ntile(100) OVER (ORDER BY v), 
      cume_dist() OVER (ORDER BY v) 
    FROM (VALUES (1), (2), (4), (4)) x(v); 

v | ntile | cume_dist 
---+-------+----------- 
1 |  1 |  0.25 
2 |  2 |  0.5 
4 |  3 |   1 
4 |  4 |   1 

आप देख सकते हैं कि ntile केवल का उपयोग करता है पहले 4 100 बाल्टी, जहां cume_dist हमेशा तुम्हारे 0 1. करने से एक संख्या देता है से बाहर तो अगर आप 99 प्रतिशतक पता लगाना चाहते हैं, तो आप सिर्फ यह कर सकते हैं 0.9 9 के तहत cume_dist के साथ सब कुछ फेंक दें और बाईं ओर से सबसे छोटा v लें।

यदि आप पोस्टग्रेस 9.4+ पर हैं, तो percentile_cont and percentile_disc इसे और भी आसान बनाते हैं, क्योंकि आपको खुद को बाल्टी बनाने की ज़रूरत नहीं है। पूर्व आपको मूल्यों के बीच इंटरपोलेशन भी देता है, यदि आपके पास एक छोटा डेटा सेट है तो फिर से उपयोगी हो सकता है।

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