2012-05-24 15 views
11

मेरे पास MySQL पर एक InnoDB तालिका में सहेजी गई कई पोस्ट हैं। तालिका में कॉलम "आईडी", "दिनांक", "उपयोगकर्ता", "सामग्री" है। मैं कुछ आंकड़े रेखांकन बनाना चाहते थे, इसलिए मैं निम्न क्वेरी का उपयोग कर कल की प्रति घंटे पदों की राशि पाने के लिए समाप्त हो गया:MySQL पर प्रति घंटा औसत पोस्ट?

table data

मैं:

SELECT HOUR(FROM_UNIXTIME(`date`)) AS `hour`, COUNT(date) from fb_posts 
WHERE DATE(FROM_UNIXTIME(`date`)) = CURDATE() - INTERVAL 1 DAY GROUP BY hour 

यह निम्न डेटा आउटपुट किसी भी दिन मुझे प्राप्त करने के लिए इस क्वेरी को संपादित कर सकते हैं। लेकिन अब मैं जो चाहता हूं वह हर दिन के प्रत्येक घंटे का औसत है, ताकि अगर दिन 1 पर 00 घंटों पर मेरे पास 20 पद हों और 00 घंटों पर दिन 2 पर मेरे पास 40 हो, तो मैं आउटपुट चाहता हूं कि "30" हो। यदि संभव हो तो मैं दिनांक अवधि भी चुन सकता हूं।

अग्रिम धन्यवाद!

उत्तर

6

आप डेटा को दिन/घंटा तक समूहित करने के लिए उप-क्वेरी का उपयोग कर सकते हैं, फिर उप-क्वेरी में औसत से घंटे ले सकते हैं।

यहाँ पिछले 7 दिनों के लिए घंटे के हिसाब से आप औसत गिनती देने के लिए एक उदाहरण है:

select the_hour,avg(the_count) 
from 
(
    select date(from_unixtime(`date`)) as the_day, 
    hour(from_unixtime(`date`)) as the_hour, 
    count(*) as the_count 
    from fb_posts 
    where `date` >= unix_timestamp(current_date() - interval 7 day) 
    and created_on < unix_timestamp(current_date()) 
    group by the_day,the_hour 
) s 
group by the_hour 
+0

आप (...) subquery के बाद "s" क्यों जोड़ते हैं? –

+1

यह उप-क्वेरी के लिए उपनाम है, जो इस त्रुटि से बचने के लिए MySQL में आवश्यक है: 'ERROR 1248 (42000): प्रत्येक व्युत्पन्न तालिका में अपना स्वयं का उपनाम होना चाहिए। यदि आप चाहते हैं और 'sub_query' जैसा कुछ उपयोग करते हैं तो आप इसके साथ अधिक वर्बोज़ हो सकते हैं। –

+0

ओह, मैं देखता हूं। हालांकि लिनॉफ समाधान बहुत समान था, यह वह है जिसने मुझे एसक्यूएल को और अधिक समझने में मदद की। धन्यवाद! –

0

तारीख और घंटे के हिसाब से सूचनाएं एकत्र करते हैं, और फिर घंटे के हिसाब से औसत ले:

select hour, avg(numposts) 
from (SELECT date(`date`) as day, HOUR(FROM_UNIXTIME(`date`)) AS `hour`, 
      count(*) as numposts 
     from fb_posts 
     WHERE DATE(FROM_UNIXTIME(`date`)) between <date1> and <date2> 
     GROUP BY date(`date`), hour 
    ) d 
group by hour 
order by 1 

तरह से, मैं, से स्पष्ट आदेश सहित पसंद करके के बाद से सबसे अधिक डेटाबेस एक समूह के परिणामों का आदेश नहीं है द्वारा। MySQL एक डेटाबेस होता है जो करता है।

+0

प्रदर्शन के लिए आपको अपने उप-क्वेरी के खंड में इनपुट मानों (दिनांक कॉलम नहीं) पर फ़ंक्शंस लागू करना चाहिए। –

+0

इसके अलावा, परिणामों को समूह द्वारा पूरी तरह से आदेश दिया जाता है, इसलिए यदि आदेश आप चाहते हैं तो आदेश आवश्यक नहीं है। –

+2

यह mysql के लिए सच प्रतीत होता है। एएनएसआई एसक्यूएल काफी विशिष्ट है कि परिणाम द्वारा समूह का आदेश नहीं दिया जाता है (भले ही वे अक्सर अभ्यास में हैं)। मैं आशा करता हूं कि mysql "आदेश द्वारा" खंड को अनदेखा करने के लिए पर्याप्त स्मार्ट है अगर उसे काम करने की आवश्यकता नहीं है। –

0
SELECT 
    HOUR(FROM_UNIXTIME(`date`)) AS `hour` 
    , COUNT(`id`) \ COUNT(DISTINCT TO_DAYS(`date`)) AS avgHourlyPostCount 
FROM fb_posts 
WHERE `date` > '2012-01-01' -- your optional date criteria 
GROUP BY hour 

यह आप सभी पोस्ट की गिनती, दिनों की संख्या से विभाजित देता घंटे के हिसाब से ।

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