Modül dersleri (2/3)
Çoklu ve zincirleme CTE'ler
Çoklu ve Zincirli CTE'ler
İLE ifadelerinin zarafeti, birkaçını birbirine zincirlediğinizde gerçekten parlıyor. Birçok CTE'yi virgülle ayırarak arka arkaya tanımlayabilirsiniz.
Ve burada yeniden düzenleme yapanların sevdiği bir şey var: Daha sonraki CTE'ler önceki CTE'lerden gelen verileri okuyabilir ve sıralı hesaplamaları parça parça açabilirler!
Çoklu CTE Örneği
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;Blok tarzı programlama! Her blok yalnızca bir iş yapar.
İki sıralı CTE tanımlayın: \n1) 'order_totals', 'orders'tan 'COUNT(*)' kullanılarak yerleştirilen 'customer_id' ve 'order_count'u hesaplar.\n2) 'gold_users', müşterileri 'order_count >= 2' ile filtreleyen 'order_totals'dan okur.\nSon olarak 'müşteriler' tablosuna KATILIN ('first_name' ve çıkarılarak) 'gold_users' (ON c.id = g.customer_id) ile 'last_name') ve ayrıca 'order_count'larını da gösterin.
İpucu göster
order_totals ve gold_users'ı virgülle ayırın (ikincisi İLE!)
3 denemeden sonra çözüm mevcut
Şimdi metrikleri basitleştirmek için birden fazla CTE kullanalım: 'max_price' oluşturun ('order_items'den 'MAX(unit_price)' kullanarak 'max_value' içeren tek bir satırı çıkarır). Ana sorguda, 'order_items'den her 'product_id' ve 'unit_price'i çıkarın ve bunun maksimum fiyattan ne kadar farklı olduğunu gösterin, '(max_price'den maksimum değeri seçin) - birim_fiyat AS farkı'nı hesaplayın. Katılma Yok — tek bir değer elde etmek için CTE'de bir alt sorgu kullanın!
İpucu göster
max_price OLARAK (...) ürün_id'sini, birim_fiyatını SEÇİN, (maks_fiyattan maksimum_değeri SEÇİN) - sipariş_ürünlerinden birim_fiyat;
3 denemeden sonra çözüm mevcut