集約関数SUM()は、結果セット内の行のグループ全体の値を合計し、各グループ(または全てのクエリ)に対して1つの値を返します。ウィンドウ関数SUM()は、SELECT内で定義された「ウィンドウ」の値に基づいて合計を計算でき、各行が結果に保持され、その「ウィンドウ」に基づく集約結果にアクセスできます。これは、グループごとの中間集計を取得するのに特に便利です。
集約関数の例:
SELECT department_id, SUM(salary) FROM employees GROUP BY department_id;
ウィンドウ関数の例:
SELECT department_id, salary, SUM(salary) OVER (PARTITION BY department_id ORDER BY hire_date) FROM employees;
「集約関数GROUP BYだけを使ってカウントサム(累積合計)を取得できますか?」
回答: いいえ!GROUP BYは最終的な集約のみを提供し、累積合計にはウィンドウ関数または、より複雑で遅いサブクエリが必要です。
例:
SELECT salary, SUM(salary) OVER (ORDER BY hire_date) AS running_total FROM employees;
逸話
トランザクションレポートでは、累積合計が多数の相関サブクエリで実現されていました。テーブルが大きくなるにつれて、パフォーマンスは数十倍低下しました。ウィンドウ関数に切り替えると、すべてが数秒に戻りました。
逸話
GROUP BYを介して集約結果を得るために複雑な分析を試みましたが、外部ソフトウェアでの抽出と処理のいくつかの段階が必要になりました。ウィンドウ関数を使用することで、1つのSQLクエリで必要なレポートを作成できました。
逸話
アナリストはウィンドウ関数を使用してクエリを書きましたが、間違ったPARTITION BYを使用したため、異なるグループの結果が混ざってしまいました。結果は歪んだレポートとなりました。グループ分けを修正した後、データは正確になりました。