Перейти к основному содержимому
Модуль 14 · Урок 2 из 354/57 в курсе~15 min
Уроки модуля (2/3)

Множественные и связанные CTE

Множественные и связанные CTE

Элегантность выражений С действительно сияет, когда вы соединяете их вместе. Вы можете определить несколько CTE подряд, разделяя их запятой.

И вот что нравится пуристам рефакторинга: более поздние CTE могут читать данные из более ранних CTE, распаковывая последовательные вычисления по частям!

Пример мульти-CTE

SQL
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;

Это блочное программирование! Каждый блок выполняет только одну работу.

Упражнение#sql.m14.l2.e1
Попыток: 0Загрузка…

Определите два последовательных 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 попыток

Упражнение#sql.m14.l2.e2
Попыток: 0Загрузка…

Теперь давайте воспользуемся несколькими 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 попыток