Ludwigmller
SQL-Guru
- Beiträge
- 172
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:
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
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
