Lektionen des Moduls (2/3)
Mehrere und verkettete CTEs
Mehrere und verkettete CTEs
Die Eleganz von WITH-Ausdrücken kommt erst richtig zur Geltung, wenn Sie mehrere miteinander verketten. Sie können mehrere CTEs hintereinander definieren und diese durch ein Komma trennen.
Und hier ist etwas, das Refactoring-Puristen lieben: Spätere CTEs können Daten von früheren CTEs lesen und sequentielle Berechnungen Stück für Stück entpacken!
Multi-CTE-Beispiel
WITH premium_customers AS (
SELECT customer_id, SUM(total_amount) AS total_spent
FROM orders
GROUP BY customer_id
),
top_customers AS (
SELECT * FROM premium_customers
WHERE total_spent > 5000
)
SELECT c.first_name, tc.total_spent
FROM customers c
JOIN top_customers tc ON c.id = tc.customer_id;Es ist Blockprogrammierung! Jeder Block erledigt nur eine Aufgabe.
Definieren Sie zwei aufeinanderfolgende CTEs: 1) „order_totals“ berechnet „customer_id“ und den „order_count“, der mit `COUNT(*)` aus „orders“ platziert wurde. 2) „gold_users“ liest aus „order_totals“ und filtert Kunden mit „order_count >= 2“. Verknüpfen Sie schließlich die Tabelle „customers“ (extrahieren „first_name“ und „last_name“) mit „gold_users“ (ON). c.id = g.customer_id) und zeigen auch deren „order_count“ an.
Hinweis anzeigen
Trennen Sie order_totals und gold_users durch ein Komma (kein zweites WITH!)
Lösung nach 3 Versuchen verfügbar
Lassen Sie uns nun mehrere CTEs verwenden, um Metriken zu vereinfachen: Erstellen Sie „max_price“ (extrahiert eine einzelne Zeile mit „max_value“ mithilfe von `MAX(unit_price)` aus „order_items“). Extrahieren Sie in der Hauptabfrage alle „product_id“ und „unit_price“ aus „order_items“ und zeigen Sie an, um wie viel sie vom Höchstpreis abweichen, indem Sie „(SELECT max_value FROM max_price) – Unit_price AS Differenz“ berechnen. Kein Join – verwenden Sie eine Unterabfrage im CTE, um einen einzelnen Wert zu erhalten!
Hinweis anzeigen
WITH max_price AS (...) SELECT product_id, unit_price, (SELECT max_value FROM max_price) - unit_price FROM order_items;
Lösung nach 3 Versuchen verfügbar