DBLog: reducelog-Funktion pro Tag statt Stunde

Begonnen von roedert, 08 Februar 2022, 14:09:33

Vorheriges Thema - Nächstes Thema

roedert

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

romakrau

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.

roedert

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.

romakrau

Dann versuche doch ein delete * from ...? where not in ( und dann dein select ) ?

romakrau

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.

Frank_Huber

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.

roedert

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 |      |



Frank_Huber

Ich denke das ist ein Anzeigethema der DB. group by ändert ja nicht den select.

romakrau

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.

Guybrush

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))

Guybrush

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.