2012-05-24 13 views
11

MySQLのInnoDBテーブルに多数の投稿が保存されています。テーブルには、「id」、「date」、「user」、「content」という列があります。私はいくつかの統計グラフを作りたかったので、私は昨日の時間あたりの記事の量を取得するには、次のクエリを使用して終了:MySQLの1時間あたりの平均投稿数は?

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

これは、次のようなデータ出力:

table data

を私はこのクエリを編集して、いつでも好きな日にすることができます。しかし今私が望むのは、毎日の毎時の平均です。したがって、1日目の00時には20の投稿があり、2日目の私は40時には、出力が「30」になるようにします。可能であれば、日付期間も選択できるようにしたいと思います。

ありがとうございます!

答えて

6

サブクエリを使用してデータを日/時間でグループ化し、サブクエリ全体で平均して1時間ごとに取得できます。ここで

は、過去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

なぜfrom(...)サブクエリの後に "s"を追加しますか? –

+1

これはサブクエリのエイリアスです。これはMySQLでこのエラーを回避するために必要なものです。 'ERROR 1248(42000):すべての派生テーブルには別のエイリアスが必要です.' 'sub_query'のようなものを使いたい場合は、もっと冗長にすることができます。 –

+0

ああ、そうだ。 Linoffのソリューションは非常に似ていましたが、これは私がSQLをもっと理解する助けとなりました。ありがとう! –

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

パフォーマンスのために、サブクエリのwhere句の入力値(日付列ではない)に関数を適用する必要があります。 –

+0

また、結果はグループbyによって暗黙的に並べ替えられます。したがって、必要な順序であれば、order byは必要ありません。 –

+2

これはmysqlにも当てはまります。 ANSI SQLは、結果別のグループが順序付けされていない(実際には頻繁に使用されていますが)非常に特殊です。私はmysqlが仕事をする必要がなければ、 "order by"節を無視するほど賢明であることを願っています。 –

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 

これはあなたの時間により、日数で割ったすべての記事の数を、提供します。

関連する問題