0

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 

これは、1 日の統計の通常の出力です。

週の統計はほぼ同じクエリです。しかし、ここでリセットはその効果を示しています..

    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が苦手で、表示されるクエリはかなり遅いです。それらを改善する方法に関する提案はありますか?

よろしくお願いします。

4

1 に答える 1

0

表の特定の値が「正しくない」と判断しましたか? 次にUPDATE、句を含むステートメントを使用しWHEREて、変更する特定の行を指定します。

テーブル内の特定の列を、特定の時間範囲について、一定の値で調整する必要があると判断しましたか? 次にUPDATE、句を含むステートメントを使用しWHEREて、変更する特定の行を指定します。

于 2018-05-27T01:42:06.630 に答える