简体   繁体   English

在mysql中计算5分钟间隔的平均值

[英]calculate averages for 5 min intervals in mysql

I have a table log with columns id , myValue , myCategory and myTimestamp .我有一个表log ,其中包含idmyValuemyCategorymyTimestamp Suppose the table is filled like this:假设表格是这样填充的:

ID ID MYVALUE我的价值 MYCATEGORY分类 MYTIMESTAMP我的时间戳
1 1 10 10 1 1 2010-11-1 10:00:00 2010-11-1 10:00:00
2 2 20 20 1 1 2010-11-1 10:03:00 2010-11-1 10:03:00
3 3 15 15 2 2 2010-11-1 10:15:00 2010-11-1 10:15:00
4 4 05 05 2 2 2010-11-1 10:19:00 2010-11-1 10:19:00
5 5 30 30 1 1 2010-11-1 10:24:00 2010-11-1 10:24:00
6 6 12 12 1 1 2010-11-1 10:30:00 2010-11-1 10:30:00

Now I would like to generate a table with an avg() for column myValue in 5 minute intervals for a specified myCheck , starting from the last check entry.现在,我想为指定的myCheck以 5 分钟的间隔为列myValue生成一个包含avg()的表,从最后一个检查条目开始。

The output for myCheck = 1 should be like: myCheck = 1的输出应如下所示:

ID ID AVERAGE平均
1 1 12 12
2 2 30 30
3 3 15 15

The output for myCheck = 2 should be like: myCheck = 2的输出应如下所示:

ID ID AVERAGE平均
1 1 10 10

What is the best way to approach this?解决这个问题的最佳方法是什么? I have basic knowledge of MySQL but this puzzles me.我对 MySQL 有基本的了解,但这让我很困惑。 Part of the query will be like this I suppose (without the 5 min interval grouping):我想部分查询将是这样的(没有 5 分钟间隔分组):

SELECT
  avg(myValue)
FROM
  log
WHERE
  myCheck = ..

How can I use the timestamps to generate 5 min intervals averages?如何使用时间戳生成 5 分钟间隔平均值? Any help is greatly appreciated.任何帮助是极大的赞赏。

See this .看到这个

SELECT
  AVG(myValue),
  from_unixtime(ROUND(myTimestamp / (60*5)) * 60 * 5) as rounded_time
FROM
  myTable
GROUP BY rounded_time

Maybe later but a shortest query would be:也许稍后,但最短的查询是:

 SELECT ID, AVG(VALUE) as average, DATE_FORMAT(MIN(timestamp), '%Y-%m-%d %H:%i:00') AS tmstamp
   FROM yourtable GROUP BY round(UNIX_TIMESTAMP(timestamp) DIV 60*5)
SELECT 
   DATE_FORMAT((atimestamp),
      concat( '%Y-%m-%d %H:' , 
            cast(round(minute(atimestamp)) -  round(minute(atimestamp)) % 5 as char))
   )AS rounded_time
   ,avg(price) , count(*) from table

This way you can get 5 , 10, 15, 30etc.这样你可以得到 5 , 10, 15, 30 等等。 minute average easily.分钟平均很容易。

In case someone else is interested here is the answer I've come up with (with help from a colleague).如果其他人对此感兴趣,这是我想出的答案(在同事的帮助下)。

First create a stored procedure in MysQL like so (original source modified from here http://ondra.zizka.cz/stranky/programovani/sql/mysql_stored_procedures.texy ) :首先像这样在 Mysql 中创建一个存储过程(从这里修改的原始源http://ondra.zizka.cz/stranky/programovani/sql/mysql_stored_procedures.texy ):

DELIMITER $$
CREATE PROCEDURE generate_series (
  iFrom TIMESTAMP, iTo TIMESTAMP, iStep INTEGER )

body:
BEGIN

  DROP TEMPORARY TABLE IF EXISTS stamp_series;
  CREATE TEMPORARY TABLE stamp_series ( stamp TIMESTAMP NOT NULL);

  IF iFrom IS NULL OR iTo IS NULL OR iStep IS NULL
    THEN LEAVE body; END IF;

  SET @iMax = iFrom;
  SET @iMin = iTo;

  InsertLoop: LOOP
    INSERT INTO stamp_series SET stamp = @iMax;
    SET @iMax = DATE_SUB( @iMax, INTERVAL iStep SECOND);
    IF @iMin > @iMax THEN LEAVE InsertLoop; END IF;
  END LOOP;

END; $$
DELIMITER ;

then the actual query is like this:那么实际的查询是这样的:

CALL generate_series( timestamp1 , timestamp2 , 300);
SELECT stamp, DATE_SUB(stamp, INTERVAL 5 MINUTE) AS stamp_min_5, (  SELECT COALESCE( AVG(value), 0) FROM `table` WHERE `category` = 1 AND timestamp <= stamp AND timestamp > DATE_SUB(stamp, INTERVAL 5 MINUTE) ) AS gem FROM stamp_series; 

Regards, Ivo问候,伊沃

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM