Есть ли способ сгруппировать периоды по одной минуте в MySQL, используя временные метки unix?

#mysql #mariadb

Вопрос:

У меня есть база данных MariaDB, содержащая некоторые данные для игры, и я хотел использовать Grafana, чтобы определить, сколько строк было вставлено каждую минуту. Я использую Node.js скрипт для извлечения данных каждую минуту из общедоступного API игры и вставки их в мою базу данных, однако я не могу понять, как заставить MySQL выводить что-то, что работает с Grafana. Что мне нужно, так это вывести таблицу со столбцом для количества новых вставок и времени в начале минутного окна. Моя база данных выглядит примерно так:

  --------------------------------------------------------------------
| auction_id | seller | buyer | timestamp | price | bin | item_bytes |
 --------------------------------------------------------------------
 

У меня есть рабочий запрос для возврата количества новых вставок для текущих данных, предоставленных API, однако я не могу понять, как получить исторические данные за последние минуты. Результат, который я ищу, будет выглядеть примерно так:

  -----------------------------
| new inserts |   timestamp   |
 -----------------------------
|     234     | 1625373706053 |
 -----------------------------
|     684     | 1625373666053 |
 -----------------------------
|     720     | 1625373626053 |
 -----------------------------
|     403     | 1625373586053 |
 -----------------------------

 

Обратите внимание, как метка времени уменьшается по 60,000 каждой строке, что эквивалентно 60 секундам или минуте. Я пробовал использовать GROUP BY и почти все другие решения, которые я мог найти на StackOverflow и других сайтах, однако это все еще не работает.

Пожалуйста, не стесняйтесь комментировать, если я недостаточно ясно выразился.

Ответ №1:

Вы можете использовать UNIX_TIMESTAMP для преобразования значений миллисекунд с начала эпохи в настоящее время. Затем агрегируйте по минутам, чтобы получить подсчеты:

 SELECT
    COUNT(*) AS `new inserts`,
    FROM_UNIXTIME(timestamp / 1000, '%Y-%m-%d %H:%i') AS ts_minute
FROM yourTable
GROUP BY ts_minute
ORDER BY ts_minute;
 

Комментарии:

1. обратите внимание, что это суммируется по четным минутам, а не через 46,053 секунды после минуты, как показано в примере