SQL PARTITION BY

概要: このチュートリアルでは、SQLのPARTITION BY句を使用して、ウィンドウ関数が結果を計算する方法を変更する方法を学びます。

SQL PARTITION BY句の概要

PARTITION BY句は、OVER句のサブ句です。PARTITION BY句は、クエリの結果セットをパーティションに分割します。ウィンドウ関数は、各パーティションで個別に操作され、各パーティションに対して再計算されます。

以下にPARTITION BY句の構文を示します。

window_function ( expression ) OVER (
    PARTITION BY expression1, expression2, ...
    order_clause
    frame_clause
)
Code language: SQL (Structured Query Language) (sql)

結果セットをパーティション分割するために、1つまたは複数の列または式を指定できます。expression1expression2などは、FROM句で導出された列のみを参照できます。SELECTリストの式やエイリアスを参照することはできません。

PARTITION BY句の式は、列式、スカラーサブクエリ、またはスカラー関数にすることができます。スカラーサブクエリとスカラー関数は常に単一の値を返すことに注意してください。

PARTITION BY句を省略すると、結果セット全体が単一のパーティションとして扱われます。

PARTITION BY vs. GROUP BY

GROUP BY句は、集計関数(例えば、SUM()AVG()など)と組み合わせてよく使用されます。GROUP BY句は、行をまとめてグループごとに合計または平均を計算することにより、返される行数を減らします。

たとえば、次のステートメントは、部門ごとの従業員の平均給与を返します。

SELECT 
    department_id, 
    ROUND(AVG(salary)) avg_department_salary
FROM
    employees
GROUP BY 
    department_id
ORDER BY
    department_id;
Code language: SQL (Structured Query Language) (sql)

次の図は結果を示しています。

SQL Partition By - group by clause

PARTITION BY句は、結果セットをパーティションに分割し、ウィンドウ関数の計算方法を変更します。PARTITION BY句は、返される行数を減らしません。

次のステートメントは、従業員の給与と、従業員の部門の平均給与も返します。

SELECT 
    first_name,
    last_name,
    department_id, 
    ROUND(AVG(salary) OVER (
        PARTITION BY department_id
    )) avg_department_salary
FROM
    employees;
Code language: SQL (Structured Query Language) (sql)

以下は出力の一部です。

sql partition by - window function AVG example

簡単に言うと、GROUP BY句は集計であり、PARTITION BY句は分析です。

このチュートリアルでは、ウィンドウ関数の結果の計算方法を変更するSQLのPARTITION BY句について学びました。

このチュートリアルは役に立ちましたか?