モジュールのレッスン (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;それはブロックスタイルのプログラミングです!各ブロックは 1 つのジョブだけを実行します。
2 つの連続した CTE を定義します: \n1) 「order_totals」は、「orders」から「COUNT(*)」を使用して配置された「customer_id」と「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 はカンマで区切ります (2 番目の WITH は不要です)。
3 回の試行後に解決策が利用可能になります
次に、複数の CTE を使用してメトリクスを簡素化しましょう。 'max_price' を作成します ('order_items' から 'MAX(unit_price)' を使用して 'max_value' を持つ 1 つの行を抽出します)。メインクエリでは、「order_items」からすべての「product_id」と「unit_price」を抽出し、「(SELECT max_value FROM max_price) - Unit_price AS 差分」を計算して最大価格とどれだけ異なるかを示します。結合なし — CTE でサブクエリを使用して単一の値を取得します。
ヒントを表示
WITH max_price AS (...) SELECT product_id、unit_price、(SELECT max_value FROM max_price) - 単位価格 FROM order_items;
3 回の試行後に解決策が利用可能になります