Модульні уроки (2/3)
Множинні та ланцюгові КТР
Множинні та ланцюгові КТР
Елегантність виразів WITH справді сяє, коли ви об’єднуєте кілька разом. Ви можете визначити багато CTE підряд, розділяючи їх комою.
І ось те, що подобається пуристам рефакторинга: пізніші CTE можуть читати дані з попередніх CTE, розпаковуючи послідовні обчислення по частинах!
Приклад мульти-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;Це блочне програмування! Кожен блок виконує лише одну роботу.
Визначте два послідовних CTE: \n1) 'order_totals' обчислює 'customer_id' і 'order_count', розміщений за допомогою `COUNT(*)` із 'orders'.\n2) 'gold_users' читає з 'order_totals', фільтруючи клієнтів за 'order_count >= 2'.\nНарешті ПРИЄДНАЙТЕСЯ до таблиці 'customers' (вилучаючи 'first_name' і 'last_name') з 'gold_users' (ON c.id = g.customer_id), а також показати їх 'order_count'.
Показати підказку
Розділяйте order_totals і gold_users комою (без другого WITH!)
Рішення доступне після 3 спроб
Тепер давайте використаємо кілька CTE, щоб спростити показники: створіть 'max_price' (виділяє один рядок з 'max_value' за допомогою `MAX(unit_price)` з 'order_items'). У головному запиті витягніть кожен 'product_id' і 'unit_price' з 'order_items' і покажіть, наскільки вони відрізняються від максимальної ціни, обчисливши '(SELECT max_value FROM max_price) - unit_price AS difference'. Без приєднання — використовуйте підзапит на CTE, щоб отримати одне значення!
Показати підказку
WITH max_price AS (...) SELECT product_id, unit_price, (SELECT max_value FROM max_price) - unit_price FROM order_items;
Рішення доступне після 3 спроб