聚合函数 SUM() 在结果集的整组行中对值进行求和,返回每个组(或整个查询)一个值。窗口函数 SUM() 则允许根据 SELECT 中定义的“窗口”值范围(通过 OVER()),计算总和,同时每一行都保留在结果中,并可访问其“窗口”的聚合结果。这对于获取组的中间汇总特别方便。
聚合函数示例:
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 进行复杂的组分析,导致多个步骤的导出和外部软件处理。窗口函数使得在一个 SQL 查询中生成所需报告成为可能。
历史
分析师编写了一个使用窗口函数的查询,但使用了错误的 PARTITION BY——不同组的结果混淆了。最终——报告失真。修正分组后,数据变得正确。