Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL上每小时的平均帖子数?_Mysql_Sql_Relational Database - Fatal编程技术网

MySQL上每小时的平均帖子数?

MySQL上每小时的平均帖子数?,mysql,sql,relational-database,Mysql,Sql,Relational Database,我在MySQL上的InnoDB表中保存了许多帖子。该表包含列id、日期、用户和内容。我想制作一些统计图,因此我最终使用以下查询来获得昨天每小时的帖子数量: SELECT HOUR(FROM_UNIXTIME(`date`)) AS `hour`, COUNT(date) from fb_posts WHERE DATE(FROM_UNIXTIME(`date`)) = CURDATE() - INTERVAL 1 DAY GROUP BY hour 这将输出以下数据: 我可以编辑此查询以获

我在MySQL上的InnoDB表中保存了许多帖子。该表包含列id、日期、用户和内容。我想制作一些统计图,因此我最终使用以下查询来获得昨天每小时的帖子数量:

SELECT HOUR(FROM_UNIXTIME(`date`)) AS `hour`, COUNT(date)  from fb_posts 
WHERE DATE(FROM_UNIXTIME(`date`)) = CURDATE() - INTERVAL 1 DAY GROUP BY hour
这将输出以下数据:

我可以编辑此查询以获得我想要的任何一天。但我现在想要的是每天每小时的平均值,所以如果第一天00点我有20篇帖子,第二天00点我有40篇,我希望输出是30篇。如果可能的话,我希望能够选择日期周期


提前谢谢

按日期和小时汇总信息,然后按小时取平均值:

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

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

您可以使用子查询按天/小时对数据进行分组,然后在子查询中按小时计算平均值

下面是一个示例,可以为您提供过去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

这将为您提供所有帖子的计数,除以天数,再除以小时。

为了提高性能,您应该将函数应用于子查询where子句中的输入值,而不是date列。此外,结果由group by隐式排序,因此,如果这是您想要的顺序,那么orderby是不必要的。ANSI SQL非常明确,分组结果不按顺序排列,即使它们在实践中经常是按顺序排列的。我希望mysql足够聪明,如果它不需要做这项工作,就可以忽略ORDERBY子句。是的,谢谢你的澄清。我的评论是针对MySQL的,因为OP使用的就是MySQL。为什么在from之后添加s。。。子查询?这是子查询的别名,MySQL中需要该别名来避免此错误:错误1248 42000:每个派生表都必须有自己的别名。如果你愿意的话,你可以更详细地使用它,并使用类似于sub_query的东西。哦,我明白了。虽然Linoff的解决方案非常相似,但这一解决方案帮助我更好地理解了SQL。谢谢
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