Lekcje modułu (2/3)
Wielokrotne i łańcuchowe CTE
Wiele i połączone CTE
Elegancja wyrażeń WITH naprawdę błyszczy, gdy połączysz kilka razem. Można zdefiniować wiele CTE z rzędu, oddzielając je przecinkiem.
A oto coś, co uwielbiają puryści zajmujący się refaktoryzacją: późniejsze CTE mogą czytać dane z wcześniejszych CTE, rozpakowując sekwencyjne obliczenia kawałek po kawałku!
Przykład wielu CTE
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;To programowanie w stylu blokowym! Każdy blok wykonuje tylko jedno zadanie.
Zdefiniuj dwa kolejne CTE: 1) „suma_zamówień” oblicza „id_klienta” i „liczba_zamówień” złożone przy użyciu `COUNT(*)` z „zamówień”. 2) „gold_users” odczytuje z „sumy_zamówień” filtrujących klientów z „liczba_zamówień >= 2”. Na koniec DOŁĄCZ do tabeli „klienci” (wyodrębniając „imię” i „last_name”) z „gold_users” (ON c.id = g.customer_id), a także pokaż ich „order_count”.
Pokaż wskazówkę
Oddziel Order_totals i gold_users przecinkiem (bez sekundy Z!)
Rozwiązanie dostępne po 3 próbach
Teraz użyjmy wielu CTE, aby uprościć metryki: Utwórz „max_price” (wyodrębnia pojedynczy wiersz z „max_value” przy użyciu `MAX(unit_price)` z „order_items”). W głównym zapytaniu wyodrębnij wszystkie „product_id” i „jednostkowa cena” z „order_items” i pokaż, jak bardzo różnią się one od ceny maksymalnej, obliczając „(SELECT max_value FROM max_price) - unit_price AS różnica”. Brak łączenia — użyj podzapytania na CTE, aby uzyskać pojedynczą wartość!
Pokaż wskazówkę
Z ceną maksymalną AS (...) WYBIERZ identyfikator_produktu, cenę_jednostkową, (WYBIERZ wartość_maksymalną Z ceny_maksymalnej) - cena_jednostkowa Z pozycji_zamówienia;
Rozwiązanie dostępne po 3 próbach