Уроки модуля (2/3)
Множественные и связанные CTE
Множественные и связанные CTE
Элегантность выражений С действительно сияет, когда вы соединяете их вместе. Вы можете определить несколько 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 запятой (без второй FOR!)
Решение доступно после 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». Нет соединения — используйте подзапрос к CTE, чтобы получить одно значение!
Показать подсказку
С max_price AS (...) SELECT product_id, unit_price, (SELECT max_value FROM max_price) - unit_price FROM order_items;
Решение доступно после 3 попыток