SQLのウィンドウ関数を使うと、データ分析の幅が広がります。
その中でもよく使われるのが PARTITION BY です。
GROUP BYとの違いも含めて今回は 初心者でもわかるように基本から応用までを解説します。
1. PARTITION BYとは? (GROUP BYとの違い)
まずは、よく混同されるGROUP BYとの違いを押さえましょう。
| 比較ポイント | GROUP BY |
PARTITION BY(ウィンドウ関数) |
|---|---|---|
| 行の数 | グループごとに1行にまとめる(行が減る) | 行はそのまま残る(減らない) |
| 用途 | グループ全体の集計を出したいとき | グループ内の情報を各行に表示したいとき |
簡単に言うと、
-
GROUP BY:まとめて集計する -
PARTITION BY:分けて集計する(行はそのまま)
2. PARTITION BYの基本構文
PARTITION BYは、ウィンドウ関数の中でOVER句と一緒に使います。
集計関数(カラム名) OVER (
PARTITION BY 区切りたいカラム
ORDER BY 並べたいカラム
) AS 新しい列名
3. 例1:部署ごとの平均給与を出す
次のような社員テーブルがあるとします。
| employee_id | department | salary |
|---|---|---|
| 1 | Sales | 500 |
| 2 | Marketing | 700 |
| 3 | Sales | 600 |
| 4 | Marketing | 800 |
各社員が「自分の部署の平均給与」と比べてどうなのかを見たい場合は、以下のように書きます。
SELECT
employee_id,
department,
salary,
AVG(salary) OVER (PARTITION BY department) AS dept_avg_salary
FROM
employees;
実行結果:
| employee_id | department | salary | dept_avg_salary |
|---|---|---|---|
| 1 | Sales | 500 | 550 |
| 3 | Sales | 600 | 550 |
| 2 | Marketing | 700 | 750 |
| 4 | Marketing | 800 | 750 |
部署ごとの平均給与が、各行にそのまま表示されました。
これで「社員1は平均より低い」「社員4は平均より高い」といった比較が簡単にできます。
4. 例2:部署ごとの給与順位をつける
PARTITION BYは、集計だけでなく順位付けにも使えます。
ここではRANK()関数を使って、部署ごとの給与ランキングを出してみます。
SELECT
employee_id,
department,
salary,
RANK() OVER (
PARTITION BY department -- 部署ごとに区切る
ORDER BY salary DESC -- 給与が高い順に並べる
) AS rank_in_dept
FROM
employees;
実行結果:
| employee_id | department | salary | rank_in_dept |
|---|---|---|---|
| 4 | Marketing | 800 | 1 |
| 2 | Marketing | 700 | 2 |
| 3 | Sales | 600 | 1 |
| 1 | Sales | 500 | 2 |
このように、部署をまたがずにグループごとの順位付けができます。
5. まとめ
PARTITION BYは「グループごとに区切って分析」できる便利な機能です。
GROUP BYと違い、レコードを残したまま集計や順位付けができるのが特徴です。
覚えておきたいポイントは以下の3つです。
-
GROUP BYはレコードをまとめる -
PARTITION BYはレコードを残したまま集計できる - 集計や順位を「グループ単位」で出すときに使える
実務では次のような場面でよく使われます。
- 売上データから「店舗ごとの売上順位」を出す
- ユーザーごとに「最新の購入履歴」を取得する
- 日付ごとの「累積売上」を計算する
PARTITION BYは分析やレポート作成で欠かせない機能です。
まずは平均値や順位付けなど、身近なケースから使ってみると理解が深まります。