在mysql中使用group by聚合5分钟时间戳间隔

nun*_*usa 2 mysql datetime truncate group-by

我有一个名为 crypto 的 mySQL 数据库,其中有一个名为 coin 的表,其中包含三个不同的列:时间戳、价格、数量。问题如下:我想按5分钟内的时间戳对数据进行分组,其中字段价格表示最大值,字段数量表示总和。

我尝试了以下命令:

SELECT sum(volume), max(price), 
round(unix_timestamp(addtime(date(0), timestamp) )/(15*60)) AS     
timestamp    
FROM btcusd_raw0
GROUP BY timestamp;
Run Code Online (Sandbox Code Playgroud)

但它不会将日期时间作为列返回。

O. *_*nes 6

将此视为将日期表达式截断到下一个最低的五分钟边界。

你怎么能这么做呢?这个(长)表达式有效:

 DATE_FORMAT(datestamp,'%Y-%m-%d %H:00') + 
            INTERVAL (MINUTE(datestamp) - MINUTE(datestamp) MOD 5) MINUTE
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

  1. DATE_FORMAT(datestamp,'%Y-%m-%d %H:00')给出表达式的小时. 例如,它2001-09-11 08:42:00变成2001-09-11 08:00:00.
  2. (MINUTE(datestamp) - MINUTE(datestamp) MOD 5)检索分钟(42在示例中)并将其转换为下一个最低的五分钟边界40
  3. hourvalue + INTERVAL minutevalue MINUTE将小时和分钟加在一起。2001-09-11 08:40:00

SELECT因此,请在查询中的和子句中使用此表达式GROUP BY

SELECT sum(volume), max(price), 
       DATE_FORMAT(timestamp,'%Y-%m-%d %H:00') + 
             INTERVAL (MINUTE(timestamp) - MINUTE(timestamp) MOD 5) MINUTE 
 FROM btcusd_raw0
GROUP BY DATE_FORMAT(timestamp,'%Y-%m-%d %H:00') + 
             INTERVAL (MINUTE(timestamp) - MINUTE(timestamp) MOD 5) MINUTE;
Run Code Online (Sandbox Code Playgroud)

它会产生冗长的查询。您可以考虑为其创建一个存储函数。这是更完整的解释