Ludwigmller
SQL-Guru
- Beiträge
- 172
Hallo,
ich möchte das 'Ergebnis von mehreren CTEs kombinieren. Allerdings soll auch eine Zeile ausgegeben werden, wenn diese für die JOIN Spalte raum nur in einem CTE vorhanden ist. Bsp.: Für raum=8 gibt es nur in abtauung eine Zeile. Mit der jetzigen Abfrage gibt es keine Ausgabe für raum=8, nur für raeume die in kuehl, nachlauf und abtauung vorhanden sind. Es wird noch ein weiteres CTE dazukommen.
ich möchte das 'Ergebnis von mehreren CTEs kombinieren. Allerdings soll auch eine Zeile ausgegeben werden, wenn diese für die JOIN Spalte raum nur in einem CTE vorhanden ist. Bsp.: Für raum=8 gibt es nur in abtauung eine Zeile. Mit der jetzigen Abfrage gibt es keine Ausgabe für raum=8, nur für raeume die in kuehl, nachlauf und abtauung vorhanden sind. Es wird noch ein weiteres CTE dazukommen.
Code:
WITH
cte AS (
SELECT log_raum.zeitstempel,
log_raum.raum,
log_raum.status,
log_raum.zeitstempel - lag(log_raum.zeitstempel) OVER (PARTITION BY log_raum.raum ORDER BY log_raum.zeitstempel) AS taktlaenge,
lag(log_raum.status) OVER (PARTITION BY log_raum.raum ORDER BY log_raum.zeitstempel) AS prev_status
FROM lagerung.log_raum
Where
zeitstempel >= '2023-01-13 00:00:00' and zeitstempel <= '2023-01-14 00:00:00'
),
kuehl AS(
SELECT cte.raum,
count(cte.taktlaenge) AS anzahl_takte,
avg(cte.taktlaenge) AS durchschnitt_taktlaenge,
min(cte.taktlaenge) as min_taktlaenge,
max(cte.taktlaenge) as max_taktlaenge,
sum(cte.taktlaenge) AS zeit_pro_tag
FROM cte
WHERE cte.prev_status =1 and status in (2, 5)
GROUP BY cte.raum
),
abtauung as(
SELECT cte.raum,
count(cte.taktlaenge) AS anzahl_takte,
avg(cte.taktlaenge) AS durchschnitt_taktlaenge,
min(cte.taktlaenge) as min_taktlaenge,
max(cte.taktlaenge) as max_taktlaenge,
sum(cte.taktlaenge) AS zeit_pro_tag
FROM cte
WHERE cte.prev_status = 5 and status in (1, 4)
GROUP BY cte.raum
),
nachlauf as(
SELECT cte.raum,
count(cte.taktlaenge) AS anzahl_takte,
avg(cte.taktlaenge) AS durchschnitt_taktlaenge,
min(cte.taktlaenge) as min_taktlaenge,
max(cte.taktlaenge) as max_taktlaenge,
sum(cte.taktlaenge) AS zeit_pro_tag
FROM cte
WHERE cte.prev_status = 7 and status in ( 3,5)
GROUP BY cte.raum
),
vorlauf as(
SELECT cte.raum,
count(cte.taktlaenge) AS anzahl_takte,
avg(cte.taktlaenge) AS durchschnitt_taktlaenge,
min(cte.taktlaenge) as min_taktlaenge,
max(cte.taktlaenge) as max_taktlaenge,
sum(cte.taktlaenge) AS zeit_pro_tag
FROM cte
WHERE cte.prev_status =8 and status in (1, 4)
GROUP BY cte.raum
)
SELECT
k.raum,
k.anzahl_takte as kuehl_takte,
k.zeit_pro_tag as kuehl_zeit,
a.anzahl_takte as abtauung_takte,
a.zeit_pro_tag as abtauung_zeit,
n.anzahl_takte as nachlauf_takte,
n.zeit_pro_tag as nachlauf_zeit
FROM kuehl as k
JOIN abtauung as a ON k.raum = a.raum
JOIN nachlauf as n ON k.raum = n.raum;