RS485経由で収集したセンサー値を保存するために、MySqlテーブルを使用しています。センサーは、すでにバッテリーに入っている電荷を合計します。放電するとプラス、充電するとマイナスです。
悲しいことに、誤って測定モジュールをリセットしてしまいました。そのため、充電量が列ごとに 161 A/h 低下し、新しいデータはそのゼロ点に関連しています。ここでは、料金、仕事、時間のリセット値を含む私のテーブル構造を見ることができます。インシデントが発生した行は青色で強調表示されます。
最善の方法でリセットするにはどうすればよいですか? resetId(s) をインデックスとして (再度発生した場合に備えて) テーブルを作成し、列のオフセットを作成することを考えました。しかし、それをクエリに統合する方法をまだ見つけていません。
私は統計を行うためにデータを使用します。何よりも、時間または日ごとの料金の違い、または最高の料金の日のトップ 10 です。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
出力先: THATここで、リセット インシデントが明確に表示されます。
ところで...私はそのSQLが苦手で、表示されるクエリはかなり遅いです。それらを改善する方法に関する提案はありますか?
よろしくお願いします。