Ich habe eine Sqlite3-DB auf einer Ramdisk, in der jede Minute die Daten
der PV-Anlage gespeichert werden.
Die Tabelle dafür hat folgende Struktur: 1 | CREATE TABLE "wr" (timestamp datetime default(datetime (current_timestamp, 'localtime')), p_zaehler integer, p_pv_o integer, p_pv_w integer, maxPower integer, c_day_o integer, c_day_w integer, c_life_o integer, c_life_w integer);
|
Es wird immer um Mitternacht die letzten Zählerstande mit dem timestamp
auf eine DB auf der SD-Karte übertragen, das funktioniert problemlos.
Die Abfrage 1 | sqlite3 /dev/shm/log.db "SELECT timestamp, c_life_o, c_life_w FROM wr WHERE (timestamp = (SELECT MAX(timestamp) FROM wr WHERE DATE(timestamp) = DATE('now', '-1 days')));"
|
liefert z.B.: 1 | 2026-02-22 17:23:26|153238|134788
|
Nun möchte ich die Maxima der Leistung (Zeitpunkte uninteressant) auch
eintragen, die Abfrage dafür 1 | sqlite3 /dev/shm/log.db "SELECT MAX(p_pv_o), MAX(p_pv_w) FROM wr WHERE DATE(timestamp) = DATE('now', '-1 days');"
|
liefert z.B.
Wie bekomme ich die beiden Abfrage so kombiniert, dass ich mit 1 | INSERT INTO wr (timestamp, zs_ost, zs_west, max_ost, max_west) <SELECT zählerstände> <SELECT maxima>;
|
diese in die Mitternachts-DB eintragen kann?
Ich bin mit UNION und JOIN bisher nicht erfolgreich gewesen.
Sollte das nicht in eine andere Tabelle rein?
1 | ATTACH DATABASE "/sd/mitternacht.db" AS sd;
| 2 |
| 3 | WITH gestern AS (
| 4 | SELECT * FROM main.wr WHERE date(timestamp) = date('now', '-1 days')
| 5 | )
| 6 | INSERT INTO sd.wr(timestamp, zs_ost, zs_west, max_ost, max_west)
| 7 | SELECT timestamp, c_life_o, c_life_w, max_ost, max_west
| 8 | FROM (SELECT max(timestamp) AS timestamp, c_life_o, c_life_w
| 9 | FROM gestern)
| 10 | CROSS JOIN (SELECT MAX(p_pv_o) AS max_ost,
| 11 | MAX(p_pv_w) AS max_west
| 12 | FROM gestern);
| 13 |
| 14 | DETACH DATABASE sd;
|
Frank D. schrieb:
> Sollte das nicht in eine andere Tabelle rein?
Ja, das klappt auch.
Clemens L. schrieb:
> WITH gestern AS (
> SELECT * FROM main.wr WHERE date(timestamp) = date('now', '-1 days')
> )
Wieder was gelernt, soweit war ich noch nicht in die Materie
eingedrungen, danke.
Clemens L. schrieb:
> INSERT INTO sd.wr(timestamp, zs_ost, zs_west, max_ost, max_west)
> SELECT timestamp, c_life_o, c_life_w, max_ost, max_west
> FROM (SELECT max(timestamp) AS timestamp, c_life_o, c_life_w
> FROM gestern)
> CROSS JOIN (SELECT MAX(p_pv_o) AS max_ost,
> MAX(p_pv_w) AS max_west
> FROM gestern);
Jetzt wird mir die korrekte Verwendung klar, danke.
Ich hatte das mit INSERT für den ersten Teil und UPDATE für die beiden
Maxima gelöst, aber so ist das viel logischer.
Matthias S. schrieb:
> Ich hatte das mit INSERT für den ersten Teil und UPDATE für die beiden
> Maxima gelöst, aber so ist das viel logischer.
... und UNION brauchst du auch nicht, weil du vermutlich dachtest das
pappt die Spalten zusammen macht aber genau das Gegenteil, es pappt
gleichspaltige Ergebnisse zusammen.
Ja, spätens als UNION gemeckert hat, dass die Anzahl rechts und links
unterschiedlich ist, war klar, dass das der falsche Dampfer ist. ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|