используйте group by в mysql для агрегации 5-минутных интервалов временных меток - PullRequest
0 голосов
/ 08 июня 2018

У меня есть база данных mySQL с именем crypto, где внутри у меня есть таблица с именем coin с тремя разными столбцами: отметка времени, цена, объем.Проблема заключается в следующем: я хочу сгруппировать данные по отметке времени в течение 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 голосов
/ 08 июня 2018

Думайте об этом как усечение выражения метки даты до следующей нижней пятиминутной границы.

Как вы можете это сделать?Это (длинное) выражение работает:

 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

Итак, используйте это выражение в своем запросе, как в предложениях 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;

Это подходит для подробных запросов.Вы можете рассмотреть возможность создания хранимой функции для него. Вот более полное объяснение .

...