Forum: PC-Programmierung Sqlite3 - zwei SELECT kombinieren


von Matthias S. (dachs)


Lesenswert?

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.
1
98|101

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.

von Frank D. (Firma: LAPD) (frank_s634)


Lesenswert?

1
INSERT INTO wr ...

Sollte das nicht in eine andere Tabelle rein?

von Clemens L. (c_l)


Lesenswert?

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;

von Matthias S. (dachs)


Lesenswert?

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.

von Frank D. (Firma: LAPD) (frank_s634)


Lesenswert?

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.

von Matthias S. (dachs)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.