[英]calculate averages for 5 min intervals in mysql
我有一個表log
,其中包含id
、 myValue
、 myCategory
和myTimestamp
。 假設表格是這樣填充的:
ID | 我的價值 | 分類 | 我的時間戳 |
---|---|---|---|
1 | 10 | 1 | 2010-11-1 10:00:00 |
2 | 20 | 1 | 2010-11-1 10:03:00 |
3 | 15 | 2 | 2010-11-1 10:15:00 |
4 | 05 | 2 | 2010-11-1 10:19:00 |
5 | 30 | 1 | 2010-11-1 10:24:00 |
6 | 12 | 1 | 2010-11-1 10:30:00 |
現在,我想為指定的myCheck
以 5 分鍾的間隔為列myValue
生成一個包含avg()
的表,從最后一個檢查條目開始。
myCheck = 1
的輸出應如下所示:
ID | 平均 |
---|---|
1 | 12 |
2 | 30 |
3 | 15 |
myCheck = 2
的輸出應如下所示:
ID | 平均 |
---|---|
1 | 10 |
解決這個問題的最佳方法是什么? 我對 MySQL 有基本的了解,但這讓我很困惑。 我想部分查詢將是這樣的(沒有 5 分鍾間隔分組):
SELECT
avg(myValue)
FROM
log
WHERE
myCheck = ..
如何使用時間戳生成 5 分鍾間隔平均值? 任何幫助是極大的贊賞。
看到這個。
SELECT
AVG(myValue),
from_unixtime(ROUND(myTimestamp / (60*5)) * 60 * 5) as rounded_time
FROM
myTable
GROUP BY rounded_time
也許稍后,但最短的查詢是:
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
這樣你可以得到 5 , 10, 15, 30 等等。 分鍾平均很容易。
如果其他人對此感興趣,這是我想出的答案(在同事的幫助下)。
首先像這樣在 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 ;
那么實際的查詢是這樣的:
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;
問候,伊沃
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.