Mehrung Behälterfüllstand je Zeiteinheit

Ludwigmller

SQL-Guru
Beiträge
171
Hallo,
ich möchte den Füllstand eines Auffangsbehälters modellieren und Zuwächse je Zeiteinheit (pro Tag) darstellen.
Die Ablesung erfolgt (leider) manuell. Es gibt folgende Szenarios:
1.) Der Füllstand wird abgelesen und der Behälter wird geleert
2.) Der Füllstand wird abgelesen und der Behälterinhalt bleibt erhalten
3.) Eine längere Zeit wird der Füllstand nicht abgelesen und der Behälter läuft über. Bei der nächsten Ablesung muss zuvor der Behälter entleert worden sein.

Entscheidend ist der Zuwachs pro Tag.
Wie macht man das am besten?


Hier ein Ansatz mit der Bitte um Verbesserungsvorschläge:
SQL:
CREATE TABLE entfeuchtung
(
    zeitstempel TIMESTAMP WITH TIME ZONE NOT NULL,
    raum_id smallint NOT NULL,
    wert numeric(4,1),
    CONSTRAINT entfeuchtung_pkey PRIMARY KEY (zeitstempel, raum_id)
)

--Testdaten
INSERT INTO entfeuchtung (zeitstempel, raum_id, wert) VALUES
('2023-02-01 06:00', 6, 0),('2023-02-02 06:00', 6, 10),('2023-02-02 06:00:01', 6, 0),('2023-02-03 06:00', 6, 11),('2023-02-03 06:00:01', 6, 0),('2023-02-04 06:00', 6, 15),('2023-02-05 06:00', 6, 30),('2023-03-01 06:00', 6, 0),('2023-03-03 06:00', 6, 40),('2023-02-01 06:00', 7, 0),('2023-02-02 06:00', 7, 20),('2023-02-02 06:00:01', 7, 0),('2023-02-04 06:00', 7, 30),('2023-02-04 06:00:01', 7, 0),('2023-02-05 18:00', 7, 15),('2023-02-06 18:00', 7, 30),('2023-02-06 18:00:01', 7, 0)

SQL:
WITH cte AS (
    SELECT
        raum_id,
        wert,
        lag(zeitstempel) OVER (PARTITION BY raum_id ORDER BY zeitstempel) AS beginn,
        zeitstempel AS ende,
        zeitstempel - (lag(zeitstempel) OVER (PARTITION BY raum_id ORDER BY zeitstempel)) AS diff_zeit,
        wert - lag(wert) OVER (PARTITION BY raum_id ORDER BY zeitstempel) AS diff_wert
    FROM lagerung.entfeuchtung
    ORDER BY zeitstempel, raum_id
)

SELECT
    *,
    round((diff_wert / extract(epoch FROM (ende - beginn)) * 86400)::numeric, 0) AS value_per_day
FROM
    cte
WHERE
    wert != 0
ORDER BY raum_id, beginn

Für Szenario 1 wird der abgelesene Wert, sowie ein 0-Wert eine Sekunde später für die Leerung gespeichert.


Der Zuwachs pro Tag wäre abfragbar.
Der nächste Schritt wäre, bei einer Ablesung an Tag X, für diesen Tag X den Zuwachs anteilig aus dieser Ablesung und der nächsten Ablesung zu berechnen. Eine Ablesung genau um Mitternacht würde dieses Problem beheben, das ist allerdings realitätsfern ;)
 
Werbung:
In Deiner Darstellung scheint mir unklar, nach welchem Muster gemessen und geleert wird.
Man kann etwas ablesen aus den Daten, aber ist das Absicht bzw. garantiert?
Wenn es ein Muster gibt (weil automatisierter Prozess), wäre es sinnvoll, das zu benennen.
Wenn nicht (oder auch wenn, aber nicht garantiert -auch Maschinen haben Fehlfunktionen), sollte man ein Modell wählen, das fehlertolerant ist.

Zur Modellierungsfrage an sich:
Die explizite Speicherung der Entleerung ist relativ resourcenhungrig. Das spielt wahrscheinlich keine Rolle, wenn es um Deinen privaten Käsekeller geht und 365 bzw. 2x365 Datensätze im Jahr anfallen. Wenn Du es mit irgendeinem Stromspar-NAS verwaltest, wird es dagegen vlt. wieder relevant.

Wenn die Zeit der Entleerung auch noch unerheblich ist bzw. die Annahme hinreichend ist, dass die Entleerung auf die Messung folgt oder eben nicht, dann kann man das einfach als Flag modellieren. Also im Messwertsatz eine Spalte dazu, die das für Deine Zwecke beschreibt. Entleerung::Boolean oder sowas.
 
Wenn die Zeit der Entleerung auch noch unerheblich ist bzw. die Annahme hinreichend ist, dass die Entleerung auf die Messung folgt
Ja, wenn entleert wird dann direkt nach Ablesung. Ich hatte auch schon eine weitere Spalte angedacht. Dann muss nur wenn eine längere Zeit nicht abgelesen wurde, und der Behälter übergelaufen ist (und nicht festgestellt werden kann wie viel übergelaufen ist), ein Datensatz mit wert=0 gespeichert werden.
nach welchem Muster gemessen und geleert wird.
Ziel: täglich oder alle zwei Tage. Da es manuell passiert, kann es aber auch Mal eine längere Zeit sein. Gerade wenn über mehrere Ablesungen im kurzen Abstand (jeden Tag) immer ähnliche Werte ermittelt wurden. Wird der Ableseabstand vermutlich erhöht. Bis zu eine Woche ist praktisch sinnvoll.
Man kann etwas ablesen aus den Daten, aber ist das Absicht bzw. garantiert?
Wie genau meinst du das? Es handelt sich um Entfeuchtung einer Kühlmaschine. Aufgrund der ermittelten Entfeuchtung pro Tag werden ggf die Einstellungen der Maschine angepasst und die Auswirkungen anhand der Entfeuchtung überprüft.
 
Wie genau meinst du das?
Wenn Du ein Muster in den Zeilen hast, das einem festen Schema folgt (wegen Maschinendaten / automatisierter Messwerterfassung), dann kannst Du damit anders umgehen, als wenn ein Mensch da rumstümpert.
Die Nutzung von Lag/Lead macht keinen Sinn, wenn nicht garantiert ist, das Datensätze in einem festen Muster vorliegen.
 
Werbung:
Die Eingabe erfolgt über ein HTML Formular. Es werden also keine Daten willkürlich eingefügt. Außerdem werde ich größtenteils der Nutzer sein
 
Zurück
Oben