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

PARTITION BYによるグループ化

PARTITION BYによるグループ化

すべての行にグローバル計算を行うと便利ですが、それだけでは不十分な場合がよくあります。すべての行の元の詳細を維持しながら、「カテゴリごと」または「顧客ごと」の平均を計算したい場合があります。

ここで、OVER(...) 句内の PARTITION BY が登場します。

PARTITION BYの仕組み

概念的には GROUP BY と同様に動作しますが、結果内の行を折りたたむのではなく、単一行の結果を計算するために関数が操作するデータの「ウィンドウ」の境界のみを定義します。

SQL
SELECT
  product_name,
  category_id,
  price,
  AVG(price) OVER(PARTITION BY category_id) AS cat_avg_price
FROM products;

各製品行には独自の詳細が保持され、cat_avg_price 列には、同じカテゴリ内の製品に限定された平均が表示されます。

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

「products」テーブルから「id」、「category_id」、「price」を抽出します。ウィンドウ関数を使用して、各「category_id」の「price」の合計を計算する「category_total」列を追加します。

エディターを読み込み中…
ヒントを表示

SUM(price) OVER(PARTITION BY category_id) を使用します。

3 回の試行後に解決策が利用可能になります

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

「reviews」テーブルから、「product_id」、「評価」、および「avg_product_rated」(製品ごとに分割された平均評価)を表示します。すべての行を表示します。

エディターを読み込み中…
ヒントを表示

AVG(評価) と PARTITION BY product_id を使用します。必要に応じて NUMERIC にキャストします。

3 回の試行後に解決策が利用可能になります