11

我有一些帖子保存到 MySQL 上的 InnoDB 表中。该表具有列“id”、“date”、“user”、“content”。我想制作一些统计图表,所以我最终使用以下查询来获取昨天每小时的帖子数量:

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 天的平均小时数:

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

顺便说一句,我更喜欢包含显式排序依据,因为大多数数据库不会对分组的结果进行排序。Mysql 恰好是这样一个数据库。

于 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 回答