2012-05-24 23 views
11

MySQL'de bir InnoDB tablosuna kaydedilmiş bir dizi gönderi var. Tabloda "id", "tarih", "kullanıcı", "içerik" sütunları bulunur. Bazı istatistik grafikler yapmak istedi, ben de dün saat başına Yayın miktarını almak için aşağıdaki sorguyu kullanarak bitti:MySQL'de saat başına ortalama mesajlar?

table data

I:

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

Bu aşağıdaki veri çıkışı İstediğim herhangi bir gün almak için bu sorguyu düzenleyebilir. Ama şu an istediğim, her günün saatinin AVERAGE'idir, yani eğer 1. günde 00 saatte 20 yazım var ve 2. günde 00 saatte 40'ım var, çıkışın "30" olmasını istiyorum. Mümkünse tarih aralığını da seçebilirim.

Şimdiden teşekkürler!

cevap

6

Verileri gün/saat olarak gruplandırmak için bir alt sorgu kullanabilir, ardından alt sorguda ortalama bir saatte alabilirsiniz. İşte

son 7 günün saatine göre size ortalama sayısını vermek bir örnek:

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

Neden (...) alt sorgusundan sonra bir "s" ekliyorsunuz? –

+1

Bu hatayı önlemek için MySQL'de gerekli olan alt sorgu için bir takma addır: 'ERROR 1248 (42000): Her türetimli tablonun kendi takma adı olmalıdır. İsterseniz sub_query gibi bir şey kullanırsanız daha ayrıntılı olabilirsiniz. –

+0

Oh, anlıyorum. Linoff çözümü çok benzer olmasına rağmen, SQL'i çok daha iyi anlamama yardımcı olan bu. Teşekkürler! –

0

tarih ve saate göre bilgi Agrega ve ardından saat ortalamasını almak: Çoğu veritabanları bir grubun sonuçlarını sipariş olmadığı şekilde, ben, tarafından açık sırası dahil tercih By

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 

tarafından. Mysql yapan bir veritabanı olur.

+0

Performans için, alt sorgunuzun bulunduğu tümcelere göre fonksiyonların giriş değerlerine (tarih sütunu değil) uygulanması gerekir. –

+0

Ayrıca, sonuçlar grup tarafından dolaylı olarak sipariş edilir, bu nedenle sipariş, istediğiniz sıraya göre gerekli değildir. –

+2

Bu mysql için geçerli gibi görünüyor. ANSI SQL, sonuçlara göre grubun (genellikle pratikte olsa bile) sıralanmamasına oldukça özgüdür. İşi yapması gerekmiyorsa, mysql'in "düzen" ibaresini görmezden gelebilecek kadar akıllı olduğunu umardım. –

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 

Bu saat, size gün sayısına bölünmesiyle bütün mesajların sayısını verir .