列中的平均行数介于5分钟之间

时间:2014-05-02 10:23:10

标签: mysql time-series aggregate-functions aggregate

我想问一下如何在5分钟内获取列中的平均行数。 为了更准确,我有一个像这样的表

id-----link_id---------date---------------------speed 
0---------123------(24/4/2014 12:03:34)----------45 
1---------123------(24/4/2014 12:04:34)----------43 
2---------127------(24/4/2014 12:04:37)----------50 
3---------123------(28/4/2014 12:03:34)----------60 

我想创建一个新表,它将具有相同link_id且在5分钟之间的行的平均速度 在我上面提到的情况下,只有前两行符合要求

我想要一个像这样的新表

id-----link_id---------date---------------------speed 
0---------123------(24/4/2014 12:00:00)----------44 
2---------127------(24/4/2014 12:00:00)----------50 
3---------123------(28/4/2014 12:00:00)----------60 

这是我必须用来创建具有这些要求的新表的查询?

提前谢谢

1 个答案:

答案 0 :(得分:2)

不清楚你的意思是'行的平均速度......在五分钟之间。'所以我猜。

我想你想计算每个不同的五分钟间隔的平均值。例如,您希望所有带时间戳的项目的平均值为2014-04-24 12:00:00至2014-04-24:12:04:59,然后是2014-04-24 12时间戳项目的另一个平均值: 05:00至2014-04-24:12:09:59,等等。

要执行此操作,您需要从一个表达式开始,该表达式将采用任何DATETIME值并将其向下舍入到其五分钟间隔的开头。你怎么做到的?

首先,这个表达式将时间戳向下舍入到它出现的分钟的开头:

  DATE_FORMAT(`date`,'%Y-%m-%d %H:%i:00')

此表达式给出了一小时后的分钟数,模数为5。

  MINUTE(`date`)%5

因此,此表达式为您提供了所需的向下舍入DATETIME

  DATE_FORMAT(`date`,'%Y-%m-%d %H:%i:00') - INTERVAL (MINUTE(`date`)%5) MINUTE

大。现在我们需要在聚合查询中使用它来计算平均速度。

SELECT link_id, 
       DATE_FORMAT(`date`,'%Y-%m-%d %H:%i:00') - INTERVAL (MINUTE(`date`)%5) MINUTE AS five_min
       AVG(speed) AS avg_speed
  FROM mytable
 GROUP BY link_id, 
          DATE_FORMAT(`date`,'%Y-%m-%d %H:%i:00') - INTERVAL (MINUTE(`date`)%5) MINUTE
 ORDER BY link_id, 
          DATE_FORMAT(`date`,'%Y-%m-%d %H:%i:00') - INTERVAL (MINUTE(`date`)%5) MINUTE

这将完成您需要完成的技巧。每个不同的link_id和五分钟的时间间隔将有一行。时间间隔将通过给出开始时间来命名。每行将包含该时间间隔内观测的平均速度。

在为此类查询创建规范时,要非常仔细地考虑您希望结果集的每一行包含哪些内容,这会很有帮助。如果您这样做,您可能会发现您的查询自然地从您的规范中流出。

这是关于如何做这类事情的更广泛的文章。

http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/