Lecciones del módulo (2/3)
CTEs múltiples y encadenadas
CTE múltiples y encadenados
La elegancia de las expresiones CON realmente brilla cuando encadenas varias. Puedes definir muchos CTE seguidos, separándolos con una coma.
Y aquí hay algo que les encanta a los puristas de la refactorización: los CTE posteriores pueden leer datos de CTE anteriores, descomprimiendo cálculos secuenciales pieza por pieza.
Ejemplo de CTE múltiple
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;¡Es programación estilo bloque! Cada bloque hace solo un trabajo.
Defina dos CTE secuenciales: 1) 'order_totals' calcula 'customer_id' y el 'order_count' colocado usando `COUNT(*)` de 'orders'. 2) 'gold_users' lee desde 'order_totals' filtrando clientes con 'order_count >= 2'. Finalmente, ÚNASE a la tabla 'clientes' (extrayendo 'first_name' y 'last_name') con 'gold_users' (ON c.id = g.customer_id), y también muestra su 'order_count'.
Mostrar pista
Separe order_totals y gold_users con una coma (¡sin segundo CON!)
Solución disponible después de 3 intentos
Ahora usemos múltiples CTE para simplificar las métricas: cree 'max_price' (extrae una sola fila con 'max_value' usando `MAX(unit_price)` de 'order_items'). En la consulta principal, extraiga cada 'product_id' y 'unit_price' de 'order_items' y muestre cuánto difiere del precio máximo, calculando '(SELECT max_value FROM max_price) - unit_price AS diferencia'. No unirse: utilice una subconsulta en el CTE para obtener un valor único.
Mostrar pista
CON max_price AS (...) SELECCIONE product_id, unit_price, (SELECT max_value FROM max_price) - unit_price FROM order_items;
Solución disponible después de 3 intentos