模块课程(2/3)
多个和链式 CTE
多重和链式 CTE
当您将多个表达式链接在一起时,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' 和使用 'orders' 中的 COUNT(*)` 放置的 'order_count'。\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(没有第二个!)
3 次尝试后可用的解决方案
现在让我们使用多个 CTE 来简化指标:创建“max_price”(使用“order_items”中的“MAX(unit_price)”提取具有“max_value”的单行)。在主查询中,从“order_items”中提取每个“product_id”和“unit_price”,并显示其与最高价格的差异,计算“(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 次尝试后可用的解决方案