【问题标题】:Average posts per hour on MySQL?MySQL 每小时平均发帖数?
【发布时间】:2012-05-24 23:21:08
【问题描述】:

我有一些帖子保存到 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”。如果可能的话,我也希望能够选择日期期间。

提前致谢!

【问题讨论】:

    标签: mysql sql relational-database


    【解决方案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
    

    【讨论】:

    • 为什么在 from (...) 子查询后面加一个“s”?
    • 这是子查询的别名,在 MySQL 中需要它来避免此错误:ERROR 1248 (42000): Every derived table must have its own alias。如果你想使用类似as sub_query 的东西,你可以更详细地使用它。
    • 哦,我明白了。尽管 Linoff 解决方案非常相似,但这是帮助我更多地理解 SQL 的解决方案。谢谢!
    【解决方案2】:

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

    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 恰好是这样一个数据库。

    【讨论】:

    • 为了性能起见,您应该将函数应用于子查询的 where 子句中的输入值(而不是日期列)。
    • 另外,结果是由 group by 隐式排序的,因此如果这是您想要的顺序,则 order by 不是必需的。
    • 这似乎适用于 mysql。 ANSI SQL 非常明确,按结果分组是没有顺序的(即使它们经常在实践中)。如果不需要做这项工作,我希望 mysql 足够聪明,可以忽略“order by”子句。
    • 是的,感谢您的澄清。我的评论是针对 MySQL 的,因为那是 OP 正在使用的。
    【解决方案3】:
    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
    

    这会给你所有帖子的计数,除以天数,按小时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多