概要: このチュートリアルでは、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つまたは複数の列または式を指定できます。expression1
、expression2
などは、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)
次の図は結果を示しています。

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)
以下は出力の一部です。

簡単に言うと、GROUP BY
句は集計であり、PARTITION BY
句は分析です。
このチュートリアルでは、ウィンドウ関数の結果の計算方法を変更するSQLのPARTITION BY
句について学びました。