11

MySQL の InnoDB テーブルに多数の投稿を保存しています。テーブルには、「id」、「date」、「user」、「content」という列があります。統計グラフを作成したかったので、最終的に次のクエリを使用して、昨日の 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

これにより、次のデータが出力されます。

テーブルデータ

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

前もって感謝します!

4

3 に答える 3

7

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

過去 7 日間の 1 時間ごとの平均カウントを表示する例を次に示します。

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
于 2012-05-24T14:46:07.927 に答える
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

ちなみに、ほとんどのデータベースは group by の結果を並べ替えないため、明示的な order by を含めることを好みます。Mysql はたまたまそうしているデータベースの 1 つです。

于 2012-05-24T14:40:48.750 に答える
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

これにより、すべての投稿の数が日数で割られ、時間ごとに表示されます。

于 2012-05-24T15:15:27.250 に答える