Я использую таблицу MySql, чтобы сохранить значения датчиков, которые я собираю по RS485.Датчик суммирует заряд, который уже ушел в аккумулятор.Это положительно при разрядке и отрицательно при зарядке.
К сожалению Я сбрасываю измерительный модуль в случае аварии. Таким образом, мой заряд падает с 161 А / ч из одного ряда в другой, и новые данныесвязано с этой нулевой точкой. ЗДЕСЬ Вы можете увидеть структуру моей таблицы со значением сброса для заряда, работы и времени.Строка, в которой произошел инцидент, выделена синим цветом.
Как я могу исправить этот сброс наилучшим образом? Я думал о создании таблицы с resetId (s)как индекс (для случая, когда это случается снова) и смещения для столбцов.Но я еще не нашел способ интегрировать это в мои запросы.
Я использую данные для статистики.Больше всего разницы в зарядке между часами или днями или Top10 для дней с лучшим зарядом.Пример запроса для dayStats (за время до инцидента) показан ниже:
SELECT
id AS _cid,
curtime AS mynow,
Date_format(curtime, '%H%:00') AS date,
Round(Min(CURRENT) / 10, 2) AS 'min current',
Round(Avg(CURRENT) / 10, 2) AS 'avg current',
Round(Max(CURRENT) / 10, 2) AS 'max current',
Round(Min(power) / 1000, 2) AS 'min power',
Round(Avg(power) / 1000, 2) AS 'avg power',
Round(Max(power) / 1000, 2) AS 'max power',
charge / 1000 AS 'charge',
Round(( ( (SELECT charge
FROM MeasurementData.SolarPower
WHERE Max(_cid) = id) - charge ) / 1000 ), 2) AS chgDiff
FROM MeasurementData.SolarPower
WHERE Day(curtime) = Day('2018-05-05 12:00:00')
GROUP BY Hour(curtime)
ORDER BY mynow DESC
Это будет обычный вывод для дневной статистики
Статистика за неделюпочти такой же запрос.Но здесь сброс показывает свой эффект.
SELECT
id AS _cid,
curtime AS mynow,
Date_format(curtime, '%d%.%m.%Y') AS date,
Date_format(curtime, '%W') AS weekday,
Round(Min(CURRENT) / 10, 2) AS 'cur-min',
Round(Avg(CURRENT) / 10, 2) AS 'cur-avg',
Round(Max(CURRENT) / 10, 2) AS 'cur-max',
Round(Min(power) / 1000, 2) AS 'pow-min',
Round(Avg(power) / 1000, 2) AS 'pow-avg',
Round(Max(power) / 1000, 2) AS 'pow-max',
Round((SELECT charge
FROM MeasurementData.SolarPower
WHERE Max(_cid) = id) / 1000, 2) AS chg,
Round((((SELECT charge
FROM MeasurementData.SolarPower
WHERE Max(_cid) = id) - charge ) / 1000 ), 2) AS chgDiff
FROM MeasurementData.SolarPower
WHERE curtime >= Date_sub('2018-05-05 12:00:00', interval 6 day)
GROUP BY DATE
ORDER BY mynow DESC
Что выводит на: ТО Здесь инцидент сброса отчетливо виден.
Кстати ... Я не слишком хорош в этом вопросе SQL, и показанные запросы довольно медленные.Любые предложения о том, как их улучшить?
Заранее спасибо, ребята.