🍌

[SQL]PARTITION BY とは(備忘録)

2025/02/08に公開

1.はじめに

PARTITION BY は、ウィンドウ関数(ROW_NUMBERRANK等)と共に使用され、データを特定の単位で分割(パーティショニング)することができます。

PARTITION BY の書き方
ウインドウ関数 OVER (PARTITION BY 分割対象列 ORDER BY 表示順指定列)

2.サンプルプログラム

〇例1:SUM関数を使用

Sample_1.sql
CREATE TABLE employees (
    employee_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(10),
    department VARCHAR(10),
    monthly_salary DECIMAL(10, 0)
);

INSERT INTO employees (
    name,
    department,
    monthly_salary
)
VALUES
('田中', '営業', 500000), ('鈴木', '営業', 550000),('高橋', '営業', 600000),('山田', '開発', 650000),('大谷', '開発', 700000);

SELECT
        name,
        department,
        monthly_salary,
        SUM(monthly_salary) OVER (PARTITION BY department ORDER BY monthly_salary desc) AS total_salary
FROM employees;

実行結果

name department monthly_salary total_salary
高橋 営業 600000 600000
鈴木 営業 550000 1150000
田中 営業 500000 1650000
大谷 開発 700000 700000
山田 開発 650000 1350000

〇例2:RANK関数 と ROW_NUMBER関数 を使用

Sample_2.sql
CREATE TABLE employees (
    employee_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(10),
    department VARCHAR(10),
    monthly_salary DECIMAL(10, 0)
);

INSERT INTO employees (
    name,
    department,
    monthly_salary
)
VALUES
('田中', '営業', 550000), ('鈴木', '営業', 550000), ('高橋', '営業', 600000), ('山田', '開発', 650000), ('大谷', '開発', 700000);

SELECT
    name,
    department,
    monthly_salary,
    RANK() OVER (PARTITION BY department ORDER BY monthly_salary DESC) AS rank,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY monthly_salary DESC) AS row_number
FROM employees
ORDER BY department;

実行結果

name department monthly_salary rank row_number
高橋 営業 600000 1 1
田中 営業 550000 2 2
鈴木 営業 550000 2 3
大谷 開発 700000 1 1
山田 開発 650000 2 2

4.参考

SQL PARTITION BYのサンプル(group byとの違い)

5.その他

実行環境

Discussion