CTE Abfrageergebnis kombinieren

Ludwigmller

SQL-Guru
Beiträge
168
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.
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;
 
Werbung:
Die magischen Worte lauten "Outer Join"
Davon gibt es verschiedene, LEFT, RIGHT, FULL, ..

Ich hoffe, Du hast das nicht wieder auch an anderer Stelle gepostet.
 
Ich hoffe, Du hast das nicht wieder auch an anderer Stelle gepostet.
Den Post den du ansprichst, ist für mich kein Doppelpost gewesen. Hier lag der Schwerpunkt auf der Entwicklung eines Datenmodells, in dem anderen Forum auf dem Parsing mit Javascript, der Post war daher auch im Unterforum Javascript. Ursprünglich hatte ich den Plan die Auswertung mit Javascript auf Grundlage einer Logfile zu machen. Dann entwickelte sich der Gesprächsverlauf auch da in Richtung Datenbank, was ja auch nahe liegt und sauberer ist. Daher habe ich das selbe DB fiddle wie hier gepostet. Einen 1:1 Doppelpost würde ich nicht machen, es sei denn über lange Zeit kommt keine Antwort.
Einige Probleme lassen sich auch ganz gut mit ChatGPT lösen, ihr werdet also weniger gefordert sein ;)


Inhaltlich teste ich später...
 
Werbung:
Den Post den du ansprichst
Ok, ich bin kein Korinthenkacker. Die Antwort ist sehr simpel, man gibt einfach selbst Verweise auf bereits existierende Diskussionen an.
Das ist eine faire Sache finde ich und u.U. noch fruchtbarer.
Jeder Teilnehmer weiß dann, worauf er sich einlässt, wozu schon welche Gedanken geäußert wurden und was noch offen ist oder schief läuft.
 
Zurück
Oben