У меня есть большое количество данных с устройства регистрации данных, хранящихся в БД MySQL, которые я хочу разместить на графике, я хочу показать данные за месяцы - регистрация ведется за секунду.
Я использую PHP и библиотеку Google Charts для рисования графика в качестве клиентской части изображения.
Нет смысла пытаться отобразить 2 628 000 на графике на экране, поэтому я хочу попытаться получить запрос SQL, чтобы дать среднее значение точки данных, скажем, каждый час (от 3600 до 1) вместо каждой секунды, , если оно не выходит за пределы .
Причина в том, что весь смысл графика состоит в том, чтобы показать, вышло ли значение за границы и когда это произошло.
Текущий SQL-запрос для получения данных, требуемых, например, за последний месяц, приведен ниже, первая проблема заключается в том, что PHP достигает предела памяти, прежде чем он сможет вернуть данные:
SELECT Tms, Hz FROM log WHERE Tms >= ".$start." AND Tms <=".$finish." ORDER BY Tms ASC
Среднее значение должно быть, например, 60, верхний предел равен 61,5, а нижний предел равен 58,5 - любое значение, выходящее за их пределы, должно быть возвращено как есть, в противном случае должна быть возвращена стоимость данных за часы в среднем за этот час.
РЕДАКТИРОВАТЬ: Чтобы ответить на комментарии:
Структура БД:
ID - double - AUTO_INCREMENT
Tms - timestamp
Hz - float
Пример данных:
ID | Tms | Hz
1 | 1559347082 | 59.91
2 | 1559347083 | 59.98
3 | 1559347084 | 60.53
4 | 1559347085 | 62.03
5 | 1559347086 | 61.11
6 | 1559347087 | 60.93
7 | 1559347088 | 60.88
.......
3606 | 1559350686 | 59.99
Ожидаемый результат будет иметь массив результатов, все значения в течение часа в среднем, если нет значения за пределами.
Таким образом, для данных выше, пункты 1,2,3 будут возвращены со средним Tms: 1559347083
и средним Hz: 60.14
, но следующее значение в массиве результатов будет Tms: 1559347085
и Hz: 62.03
.
Результаты:
Tms: 1559347083 | Hz: 60.14
Tms: 1559347085 | Hz: 62.03
Tms: 1559348886 | Hz: 60.17
Максимальное количество точек, которые будут усреднены или сгруппированы, составило бы 3600 строк = 1 час, поэтому график показывает некоторое движение.
Одна из текущих ошибок при попытке выделить большой объем данных:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes)
Это происходит, когда результат помещается в массив, поэтому я могу добавить значения границ, чтобы на графике была четкая линия:
while($row = $result->fetch_assoc()) {
$dataPoint = array($row['Tms'], '58.5', $row[$graph], '61.5');
....
array_push($dataPoints, $dataPoint);
Этот массив ($ dataPoints) затем передается функции либо для вывода в виде JSON, либо для вывода в виде CSV с использованием fputcsv