メインコンテンツにスキップ
モジュール 14 · レッスン 2 / 3コース内の 54/57~15 min
モジュールのレッスン (2/3)

複数のチェーンされた CTE

複数のチェーンされた CTE

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;

それはブロックスタイルのプログラミングです!各ブロックは 1 つのジョブだけを実行します。

運動#sql.m14.l2.e1
試行回数: 0読み込み中…

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 回の試行後に解決策が利用可能になります

運動#sql.m14.l2.e2
試行回数: 0読み込み中…

次に、複数の 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 回の試行後に解決策が利用可能になります