PC-Programmierung
›
Thread
Sqlite3 - zwei SELECT kombinieren
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.
FD
Frank D.
(frank_s634)
(Firma: LAPD)
23.02.2026 13:18
#8013922
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.
FD
Frank D.
(frank_s634)
(Firma: LAPD)
23.02.2026 13:48
#8013945
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. ;-)
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren