Вопрос

У меня есть таблица, которая содержит данные, записываемые каждую минуту, поэтому у меня есть строка для каждой минуты.При возврате данных для обработки требуется такая точность за последние 6 часов, но после этого достаточно более низкого уровня точности, напримеркаждые 5 минут.

Я могу вернуть все данные в массив, а затем удалить все, кроме каждого 5-го элемента, но для этого требуется, чтобы все данные возвращались MySQL, а затем сначала считывались в массив - довольно много данных.

Как я могу вернуть каждую n-ю строку в MySQL?Я прочитал это сообщение в блоге, в котором предлагается использовать PrimaryKey % 5 = 0, где PrimaryKey - это auto_increment, но это

a) не использует индексы b) возвращает только значения PrimaryKey, которые делятся на 5 и в случае удаления могут фактически не находиться в каждой пятой строке

Можно ли это сделать только в рамках SQL-запроса или для этого потребуется перебирать строку за строкой по результирующему набору с помощью курсоров?

Я использую MySQLi в PHP для подключения к базе данных.

Это было полезно?

Решение

Список временных меток каждые 5 минут:

SELECT
  MIN(logtimestamp) AS first_of_five_minutes
FROM tLog
GROUP BY
  DATE(logtimestamp),
  HOUR(logtimestamp),
  MINUTE(logtimestamp) - (MINUTE(logtimestamp) % 5)

Теперь вы можете использовать это как дополнительный выбор, чтобы получить запрошенные записи журнала, присоединившись logtimestamps Для first_of_five_minutes на .Конечно, дополнительные WHERE-предложения должны быть реплицированы внутри и снаружи, чтобы вы получили "правильные" временные метки.

Также обратите внимание, что это возвращает первую временную метку за каждый пятиминутный интервал, тогда как решения напрямую используют minutes%5 = 0 возвращайте только логи, которые на самом деле кратны : 05, что может привести к сбою, если у вас возникли задержки при записи журналов или что-то подобное.

Другие советы

полностью непроверенный, но это может сработать

SELECT Row, col_a 
FROM (SELECT @row := @row + 1 AS Row, col1 AS col_a FROM table1) As derived1 
WHERE Row%5 = 0; 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top