Sqlite3 - zwei SELECT kombinieren

OP #8013880
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.

#8013924
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;
OP #8013940
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren