我想问一下如何取列中 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 分钟之间的行的平均速度 在我上面提到的情况下,只有前两行符合要求
我想要一个像这样的新 table
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
我必须使用哪个查询来创建符合这些要求的新表?
提前谢谢
最佳答案
不清楚“五分钟之间的行的平均速度”是什么意思。所以我会猜测。
我猜您想计算每个不同的五分钟间隔的平均值。例如,您需要时间戳从 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/
关于mysql - 列中间隔 5 分钟的平均行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23425867/