我在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”。如果可能的话,我希望能够选择日期。
提前致谢!
答案 0 :(得分:6)
您可以使用子查询按天/小时对数据进行分组,然后在子查询中按小时计算。
以下是一个示例,为您提供过去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
答案 1 :(得分: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碰巧是一个数据库。
答案 2 :(得分: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
这会为您提供所有帖子的计数,除以天数,以小时为单位。