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
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.
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.
Dann versuche doch ein delete * from ...? where not in ( und dann dein select ) ?
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.
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.
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 | |
Ich denke das ist ein Anzeigethema der DB. group by ändert ja nicht den select.
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.
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))
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.