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

时间:2018-06-08 10:42:44

标签: mysql datetime group-by truncate

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

我尝试了以下命令:

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

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

1 个答案:

答案 0 :(得分:1)

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

你怎么能这样做?这个(长)表达式起作用:

 DATE_FORMAT(datestamp,'%Y-%m-%d %H:00') + 
            INTERVAL (MINUTE(datestamp) - MINUTE(datestamp) MOD 5) MINUTE

它是如何运作的?

  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
  4. 因此,请在SELECTGROUP 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;
    

    这会产生冗长的查询。您可以考虑为其创建存储函数。 Here's a more complete explanation