0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PARTITION BYとGROUP BYの違いについて

Last updated at Posted at 2024-11-24

概要

本記事では、BigQueryでの「パーティション(PARTITION BY)」と「グループ(GROUP BY)」の違いについて、サンプルデータを基に実例を示します。それぞれの結果がどのように異なるのかを明確に理解するため、SQLクエリの出力も説明します。

ステップ 1: サンプルテーブルの作成

以下のSQLを実行して、サンプルテーブル data-sandbox.test.employees を作成します。

サンプルデータ

社員の部門(department)、名前(employee)、給与(salary)が含まれています。

CREATE OR REPLACE TABLE `data-sandbox.test.employees` AS
SELECT 'HR' AS department, 'Alice' AS employee, 5000 AS salary UNION ALL
SELECT 'HR', 'Bob', 4500 UNION ALL
SELECT 'HR', 'Charlie', 5500 UNION ALL
SELECT 'IT', 'Dave', 7000 UNION ALL
SELECT 'IT', 'Eve', 8000 UNION ALL
SELECT 'IT', 'Frank', 7500 UNION ALL
SELECT 'Finance', 'Grace', 6000 UNION ALL
SELECT 'Finance', 'Hank', 6500 UNION ALL
SELECT 'Finance', 'Ivy', 6200;

テーブルの内容:

department employee salary
HR Alice 5000
HR Bob 4500
HR Charlie 5500
IT Dave 7000
IT Eve 8000
IT Frank 7500
Finance Grace 6000
Finance Hank 6500
Finance Ivy 6200

ステップ 2: GROUP BYを使用した集計

部門ごとの合計給与(department_total_salary)を計算するクエリです。

SELECT
  department,
  SUM(salary) AS department_total_salary
FROM `data-sandbox.test.employees`
GROUP BY department;

結果:
スクリーンショット 2024-11-24 23.08.38.png

解説:

  • GROUP BY で部門ごとに行をまとめ、給与を合計しました。
  • 各部門に対して1行だけが結果として出力されます。

ステップ 3: PARTITION BYを使用したウィンドウ関数

部門ごとに各社員の給与と部門の合計給与を併せて表示します。

SELECT
  department,
  employee,
  salary,
  SUM(salary) OVER (PARTITION BY department) AS department_total_salary
FROM `data-sandbox.test.employees`;

結果:
スクリーンショット 2024-11-24 22.45.41.png

解説:

  • PARTITION BY department で部門ごとにデータを分けて、それぞれの合計給与を計算しています。
  • 元の行数を保ちながら、部門ごとの合計値が繰り返し表示されます。

ステップ 4: パーティションとグループの違いのまとめ

特徴 GROUP BY PARTITION BY
目的 データを集約して1行にまとめる データを分割しつつ行ごとに計算を適用
結果の行数 グループ単位で1行 元の行数を保持
使用例 部門ごとの売上合計を計算 部門ごとの売上合計を元の行に表示
適用箇所 集約クエリ ウィンドウ関数

ステップ 5: 応用クエリ

部門ごとの給与ランキングを計算する例(PARTITION BYを応用):

SELECT
  department,
  employee,
  salary,
  RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS salary_rank
FROM `data-sandbox.test.employees`;

結果:
スクリーンショット 2024-11-24 23.07.44.png

結論

  • GROUP BY はデータをまとめて集計するのに最適で、グループごとに1行の結果が必要な場合に使用します。
  • PARTITION BY はデータを分割してウィンドウ関数を適用する際に使い、行ごとの計算や分析に便利です。

BigQueryでの集計や分析の際、用途に応じて適切な手法を選択してください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?