2013-02-24 105 views
5

मैं एक साधारण तालिका BIRDCOUNT नीचे है, दिखा कितने पक्षियों किसी भी दिन की गिनती की गई बनाएँ:Mysql freqency वितरण

+----------+ 
| NUMBIRDS | 
+----------+ 
| 123  | 
| 573  | 
| 3  | 
| 234  | 
+----------+ 

मैं एक आवृत्ति वितरण ग्राफ़ बनाने के लिए, दिखा चाहते हैं कितनी बार के एक नंबर पक्षियों की गिनती थी। इसलिए मुझे कुछ बनाने के लिए MySQL की आवश्यकता है:

+------------+-------------+ 
| BIRD_COUNT | TIMES_SEEN | 
+------------+-------------+ 
| 0-99  | 17   | 
| 100-299 | 23   | 
| 200-399 | 12   | 
| 300-499 | 122   | 
| 400-599 | 3   | 
+------------+-------------+ 

यदि पक्षी गणना श्रेणी तय की गई तो यह आसान होगी। हालांकि, मैं कभी नहीं जानता कि कितने पक्षियों को देखा गया था। इसलिए मुझे एक चुनिंदा बयान की आवश्यकता है कि:

  1. उपरोक्त के समान आउटपुट बनाता है, हमेशा 10 श्रेणियों की गणना करता है।
  2. (अधिक उन्नत) उपरोक्त के समान आउटपुट बनाता है, हमेशा गणनाओं की एन श्रेणियां बनाते हैं।

मुझे नहीं पता कि एक ही चयन में # 2 संभव है लेकिन क्या कोई # 1 हल कर सकता है?

SELECT dateColumn, COUNT(*) AS NUMBIRDS 
FROM birdTable 
GROUP BY dateColumn 
यदि ऐसा है तो

, तुम सब करने के लिए है "बिन" अपने मायने रखता है:

+0

अब तक मुझे एक चयन में न्यूनतम और अधिकतम मिला है, और उसके बाद एन श्रेणियों में विभाजित किया गया है, PHP में एक चयन कथन का निर्माण क्रमशः श्रेणियों को बनाते हुए, फिर दूसरा चयन चला रहा है। यह वास्तव में किसी के जवाब के साथ आने में मदद नहीं करता है, लेकिन जब से आपने पूछा था। – TSG

+0

क्या आप एक ही नमूना डेटा दे सकते हैं और आप क्या परिणाम चाहते हैं? –

+0

और यदि bird_count = 200, तो यह किस पंक्ति में होगा? –

उत्तर

6
SELECT 
    FLOOR(birds.bird_count/stat.diff) * stat.diff as range_start, 
    (FLOOR(birds.bird_count/stat.diff) +1) * stat.diff -1 as range_end, 
    count(birds.bird_count) as times_seen 
FROM birds_table birds, 
    (SELECT 
     ROUND((MAX(bird_count) - MIN(bird_count))/10) AS diff 
    FROM birds_table 
    ) AS stat 
GROUP BY FLOOR(birds.bird_count/stat.diff) 

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

+0

यह आशाजनक लग रहा है (अभी तक परीक्षण नहीं किया गया है)। मुझे लगता है कि ग्रुप प्रत्येक सीमा के लिए गिनती को मजबूर करेगा (जैसे WHERE> = range_start और <= range_end) ... – TSG

+0

क्या होता है यदि कोई पक्षियों को किसी भी श्रेणी में गिना जाता है? मुझे लगता है कि यह आउटपुट की एक पंक्ति नहीं बनाएगा (यानी 0 की चिड़िया गिनती के साथ कोई पंक्ति नहीं)। – TSG

+0

यह नहीं होगा। इसके बारे में सोचकर आप बाहरी शामिल होने का प्रयास कर सकते हैं, उदाहरण के साथ मैं कुछ मिनटों में जवाब संपादित करूंगा। यदि आपको गतिशील संख्या की आवश्यकता होती है तो केवल एसक्यूएल का उपयोग करना मुश्किल होगा। – Gustek

0

मैं अपने वास्तविक SQL क्वेरी पर लगता है कि

SELECT CONCAT_WS('-', 
    FLOOR(NUMBIRDS/100)*100, 
    ((FLOOR(NUMBIRDS/100)+1)*100) - 1 
) AS BIRD_COUNT 
,COUNT(*) AS TIMES_SEEN 
FROM (
    SELECT dateColumn, COUNT(*) AS NUMBIRDS 
    FROM birdTable 
    GROUP BY dateColumn 
) AS birdCounts 
GROUP BY BIRD_COUNT 

दी, अगर श्रृंखलाओं में से एक गुम है, आपको एक मिलान पंक्ति नहीं मिलेगी - लेकिन यदि आप कोई समस्या है तो आप इसे बाएं जॉइन के साथ आसानी से हल कर सकते हैं।

0

इस तरह कुछ बनाते समय, ग्रुप बाय, आपका मित्र है। मूल विचार प्रत्येक मान को बाल्टी में रखना है, और फिर प्रत्येक बाल्टी में तत्वों की संख्या को गिनना है। बाल्टी बनाने के लिए, आप एक फ़ंक्शन को परिभाषित करते हैं जो मूल्य लेता है और बाल्टी के लिए एक अद्वितीय मान की गणना करता है।

कुछ इस तरह:

SELECT 
    @low := TRUNCATE(bird_count/100, 0) * 100 as Low, 
    TRUNCATE(@low + 99, 0) as High, 
    COUNT(*) AS Count 
FROM birds_seen 
GROUP BY Low; 

इस मामले में, आप एक समारोह है कि पक्षी गिनती लेने को परिभाषित है, और बाल्टी की निचली सीमा की गणना। फिर आप निचले रेंज पर सभी मानों को समूहित करते हैं, उदाहरण के लिए, "100" लेबल वाली बाल्टी में 123 और 145, और "200" लेबल वाली बाल्टी में 234 और 246 रखेंगे।

अब, प्रत्येक मान एक बाल्टी में रखा गया है, और आप बाल्टी लेबल द्वारा मानों को समूहित कर सकते हैं, और प्रत्येक बाल्टी में तत्वों की संख्या गिन सकते हैं।

+0

आप पक्षियों की सबसे ऊंची और निम्नतम संख्या नहीं जानते हैं, इसलिए आपका समाधान बड़ी संख्या में श्रेणियों (आकार 100 में से प्रत्येक) बनाएगा। – TSG

+0

वास्तव में नहीं, यह केवल उन मानों के लिए बाल्टी बनाएगा जो वास्तव में तालिका में हैं। –