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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.