FHEM Forum

FHEM => Automatisierung => Thema gestartet von: roedert am 08 Februar 2022, 14:09:33

Titel: DBLog: reducelog-Funktion pro Tag statt Stunde
Beitrag von: roedert am 08 Februar 2022, 14:09:33
Die ReduceLog-Funktion von DBLog hebt ja 1 Auftrag pro Stunde auf, Genua diese Funktionalität suche ich aber mit einem (dem ersten) Eintrag pro Tag.
Gerne kann ich das auch manuell per SQL-Statement direkt auf die DB machen, aber ih habe noch keinen richtigen Ansatz für ein SQL-Stamenet:
"Lösche alle Einträge für das Reading kWh älter 30 Tage außer dem jeweils ersten Eintrag eines Tages"

Hat hier wer nen Denkanstoss für mich?
Der SELECT für die zu löschenden Datensätze wäre
select * from history where reading="kWh" group by date(timestamp) and timestamp-now()>30
Nur will ich ja genau diese Records löschen statt auswählen
Titel: Antw:DBLog: reducelog-Funktion pro Tag statt Stunde
Beitrag von: romakrau am 09 Februar 2022, 01:54:42
Wenn du dir sicher bist das dir dein select nur die Datensätze anzeigt die du löschen möchtest, ersetze das select durch ein delete. Evtl. noch ein commit hinterher, je nach DB.
Titel: Antw:DBLog: reducelog-Funktion pro Tag statt Stunde
Beitrag von: roedert am 09 Februar 2022, 02:36:33
So einfach ist es leider nicht, da ein GROUP BY nicht mit DELETE funktioniert.
Außerdem hatte ich einen Denkfehler bzw. mich verschrieben, der SLEECT liefert die Records die ich aufbewahren, also NICHT löschen möchte.
Titel: Antw:DBLog: reducelog-Funktion pro Tag statt Stunde
Beitrag von: romakrau am 09 Februar 2022, 07:10:14
Dann versuche doch ein delete * from ...? where not in ( und dann dein select ) ?
Titel: Antw:DBLog: reducelog-Funktion pro Tag statt Stunde
Beitrag von: romakrau am 09 Februar 2022, 08:14:29
Ein groupby ergibt niemals nur den ersten Datensatz eines Tages? Überdenke nochmal dein select Statement.
Es gibt da was mit einem Ergebniszähler in SQL. Schau mal auf die man-pages.
Titel: Antw:DBLog: reducelog-Funktion pro Tag statt Stunde
Beitrag von: Frank_Huber am 09 Februar 2022, 08:16:58
delete ist ohne *.
Und Achtung, der Select im ersten post listet ALLE Einträge. Ein delete mit diesem select löscht dann alles, auch die ersten pro Tag.
Titel: Antw:DBLog: reducelog-Funktion pro Tag statt Stunde
Beitrag von: roedert am 09 Februar 2022, 08:20:04
Zitat von: romakrau am 09 Februar 2022, 08:14:29
Ein groupby ergibt niemals nur den ersten Datensatz eines Tages? Überdenke nochmal dein select Statement.

Das hat mich ehrlich gesagt selbst gewundert, aber es funktioniert.

MariaDB [fhem]> select * from history where reading="Energy_total__kWh";
+---------------------+--------------+---------------+-----------------------------+-------------------+----------+------+
| TIMESTAMP           | DEVICE       | TYPE          | EVENT                       | READING           | VALUE    | UNIT |
+---------------------+--------------+---------------+-----------------------------+-------------------+----------+------+
| 2022-02-07 20:22:17 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8113.697 | Energy_total__kWh | 8113.697 |      |
| 2022-02-07 20:34:18 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8113.849 | Energy_total__kWh | 8113.849 |      |
| 2022-02-07 20:46:19 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8113.982 | Energy_total__kWh | 8113.982 |      |
| 2022-02-07 20:58:18 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8114.119 | Energy_total__kWh | 8114.119 |      |
| 2022-02-07 21:10:19 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8114.253 | Energy_total__kWh | 8114.253 |      |
| 2022-02-07 21:22:20 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8114.395 | Energy_total__kWh | 8114.395 |      |
| 2022-02-07 21:34:20 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8114.522 | Energy_total__kWh | 8114.522 |      |
| 2022-02-07 21:46:20 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8114.649 | Energy_total__kWh | 8114.649 |      |
| 2022-02-07 21:58:20 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8114.787 | Energy_total__kWh | 8114.787 |      |
| 2022-02-07 22:10:20 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8114.919 | Energy_total__kWh | 8114.919 |      |
| 2022-02-07 22:22:21 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8115.046 | Energy_total__kWh | 8115.046 |      |
| 2022-02-07 22:34:22 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8115.158 | Energy_total__kWh | 8115.158 |      |
| 2022-02-07 22:46:23 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8115.258 | Energy_total__kWh | 8115.258 |      |
| 2022-02-07 22:58:23 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8115.363 | Energy_total__kWh | 8115.363 |      |
| 2022-02-07 23:10:23 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8115.462 | Energy_total__kWh | 8115.462 |      |
| 2022-02-07 23:22:24 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8115.547 | Energy_total__kWh | 8115.547 |      |
| 2022-02-07 23:34:24 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8115.628 | Energy_total__kWh | 8115.628 |      |
| 2022-02-07 23:46:25 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8115.709 | Energy_total__kWh | 8115.709 |      |
| 2022-02-07 23:58:25 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8115.795 | Energy_total__kWh | 8115.795 |      |
| 2022-02-08 00:10:27 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8115.883 | Energy_total__kWh | 8115.883 |      |
| 2022-02-08 00:22:26 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8115.980 | Energy_total__kWh | 8115.980 |      |
| 2022-02-08 00:34:26 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8116.076 | Energy_total__kWh | 8116.076 |      |
| 2022-02-08 00:46:26 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8116.175 | Energy_total__kWh | 8116.175 |      |


MariaDB [fhem]> select * from history where reading="Energy_total__kWh" group by date(timestamp);
+---------------------+--------------+---------------+-----------------------------+-------------------+----------+------+
| TIMESTAMP           | DEVICE       | TYPE          | EVENT                       | READING           | VALUE    | UNIT |
+---------------------+--------------+---------------+-----------------------------+-------------------+----------+------+
| 2022-02-07 20:22:17 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8113.697 | Energy_total__kWh | 8113.697 |      |
| 2022-02-08 00:10:27 | Strom.gesamt | MODBUSSDM630M | Energy_total__kWh: 8115.883 | Energy_total__kWh | 8115.883 |      |


Titel: Antw:DBLog: reducelog-Funktion pro Tag statt Stunde
Beitrag von: Frank_Huber am 09 Februar 2022, 08:27:50
Ich denke das ist ein Anzeigethema der DB. group by ändert ja nicht den select.
Titel: Antw:DBLog: reducelog-Funktion pro Tag statt Stunde
Beitrag von: romakrau am 09 Februar 2022, 08:33:15
Ein groupby ist immer eine ZUSAMMENFASSUNG! auch wenn sie so nicht angezeigt wird.
Das Zauberwort heisst in SQLPLUS rownum . Wenn Du die Routine täglich laufen lässt und ein delete über die Tagessätze 
delete * from where in select * sortby timestamp where date-1 and rownum >1 sollte es gehen.
Titel: Antw:DBLog: reducelog-Funktion pro Tag statt Stunde
Beitrag von: Guybrush am 17 Februar 2022, 03:21:47
ist doch trivial:


DELETE FROM history
WHERE reading = "kWh"
   && timestamp < DATE_SUB(NOW(), INTERVAL 30 day)
   && timestamp NOT IN (SELECT MIN(timestamp)
                        FROM history
                        WHERE reading = "kWh"
                           && timestamp < date_sub(now(), interval 30 day)
                        GROUP BY DATE(timestamp))
Titel: Antw:DBLog: reducelog-Funktion pro Tag statt Stunde
Beitrag von: Guybrush am 17 Februar 2022, 03:43:15
Zitat von: romakrau am 09 Februar 2022, 08:33:15
Ein groupby ist immer eine ZUSAMMENFASSUNG! auch wenn sie so nicht angezeigt wird.
Das Zauberwort heisst in SQLPLUS rownum . Wenn Du die Routine täglich laufen lässt und ein delete über die Tagessätze 
delete * from where in select * sortby timestamp where date-1 and rownum >1 sollte es gehen.

was ist das für ein sql statement? ein group by ist übrigens auch keine zusammenfassung wie du es meinst, sondern es wird da nur noch ein wert entsprechend des group by selektiert. schränkt man das nicht ein, ist es immer der mit der kleinsten rowid, was in dem fall denklogisch immer das kleinste timestamp ist.