ウインドウ関数(Window Function)は、SQLでデータを集計・分析する際に便利な機能の一つです。集計関数のようにデータをグループ化するのではなく、クエリの結果セットの「ウインドウ(範囲)」内で計算を行うことができます。これにより、各行に対して集計した値を計算しつつ、行ごとの情報も保持したまま結果を取得できます。
ウインドウ関数の特徴
1. 部分集計の実行: グループ化したデータに対する操作ではなく、行ごとに集計結果を表示できます。例えば、売上データの各行に対して累計売上を計算するなど。
2. OVER 句の使用: ウインドウ関数ではOVER句を使って計算の範囲(ウインドウ)を定義します。このウインドウ内で集計を行うことで、結果セットの一部または全体に対して計算が可能です。
ウインドウ関数の使用例
一般的にウインドウ関数はSUM()、AVG()、RANK()、ROW_NUMBER()などの関数と共に使用されます。
1. ROW_NUMBER()
各行にユニークな行番号を付けるためのウインドウ関数です。
SELECT
employee_id,
name,
department,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
FROM
employees;
この例では、salaryの降順で全従業員に対してROW_NUMBERを割り振ります。これにより、給与順にランクを付けることができます。
2. RANK()
同じ値に対して同じランクを付けますが、次のランクは飛ばされます。
SELECT
employee_id,
name,
salary,
RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM
employees;
RANK()は、同じ給与を持つ従業員に対して同じランクを与え、次のランクはその分飛ばして付けます。たとえば、1位が2人いる場合、次は3位になります。
3. SUM()(ウインドウ関数として使用)
累計などを計算するために使います。
SELECT
employee_id,
name,
department,
salary,
SUM(salary) OVER (PARTITION BY department ORDER BY employee_id) AS department_salary_cumulative
FROM
employees;
この例では、departmentごとに給与の累計を計算します。PARTITION BYを使って部署ごとにウインドウを分け、その中でORDER BYによってemployee_idの順で累計を計算しています。
OVER句の詳細
OVER句はウインドウ関数の範囲(ウインドウ)を指定するために使われます。OVER句には以下の構成要素があります:
1. PARTITION BY:
ウインドウをグループ化するために使います。GROUP BYに似ていますが、行をグループ化することなく、グループ内で計算を行います。
SUM(salary) OVER (PARTITION BY department)
この場合、各部署ごとの給与合計が計算されます。
2. ORDER BY:
ウインドウ内で計算する際の並び順を指定します。これによって、累積の計算や順位付けなどが可能になります。
RANK() OVER (ORDER BY salary DESC)
これにより、給与の降順にランク付けがされます。
3. フレーム句 (ROWS または RANGE):
ウインドウ内でさらに特定の範囲を指定することができます。例えば、直前の行や直後の行を含めた累積の計算などに使われます。
SUM(salary) OVER (ORDER BY employee_id ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)
この例では、現在の行とその直前の行を含む範囲の給与の合計が計算されます。
ウインドウ関数のメリット
1. 集計と詳細の同時表示: グループ化せずに行ごとの情報を保持しつつ、集計結果も表示できるため、詳細データと集計データを同時に取得できます。
2. 高度な分析: 累積値、移動平均、順位付けなど、複雑な分析を容易に行うことができます。
ウインドウ関数の使用例
たとえば、売上データを分析する場合、各日ごとの売上の合計と累積売上を同時に表示したいときがあります。これをウインドウ関数で実現できます。
SELECT
sales_date,
sales_amount,
SUM(sales_amount) OVER (ORDER BY sales_date) AS cumulative_sales
FROM
sales;
この例では、日ごとの売上額(sales_amount)と、その日までの累積売上額(cumulative_sales)を計算しています。
まとめ
ウインドウ関数は、データ分析や集計を行う際に非常に便利なツールです。通常の集計関数のようにグループ化せず、行ごとの詳細情報を保持したまま集計を行うことができ、ランキング、累計、移動平均など複雑な処理も簡単に表現できます。OVER句を使って集計範囲を柔軟に指定できるため、多様な分析ニーズに応えることが可能です。