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

Множинні та ланцюгові КТР

Множинні та ланцюгові КТР

Елегантність виразів WITH справді сяє, коли ви об’єднуєте кілька разом. Ви можете визначити багато 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 комою (без другого WITH!)

Рішення доступне після 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 difference'. Без приєднання — використовуйте підзапит на CTE, щоб отримати одне значення!

Завантаження редактора…
Показати підказку

WITH max_price AS (...) SELECT product_id, unit_price, (SELECT max_value FROM max_price) - unit_price FROM order_items;

Рішення доступне після 3 спроб