窗口函数技术疑问:如何实现无分区的SUM聚合计算?
实现无分区的窗口SUM函数获取整列总和
嘿,这问题太常见了!你要的就是不指定分区的窗口SUM计算,完全不用分组操作,直接让窗口覆盖整个数据集就行。
核心写法特别简单,只需要把PARTITION BY子句去掉,让OVER()括号里保持为空:
SUM(your_column) OVER () AS total_column_sum
举个实际例子
假设你有一张orders表,结构如下:
| order_id | order_amount |
|---|---|
| 1 | 100 |
| 2 | 200 |
| 3 | 150 |
执行下面的查询:
SELECT order_id, order_amount, SUM(order_amount) OVER () AS total_sales FROM orders;
返回的结果会是:
| order_id | order_amount | total_sales |
|---|---|---|
| 1 | 100 | 450 |
| 2 | 200 | 450 |
| 3 | 150 | 450 |
可以看到,total_sales列每一行都是整个order_amount列的总和,完全符合你要的“常量值填充每一行”的需求。
补充说明
- 兼容性:这个写法在MySQL 8.0+、PostgreSQL、SQL Server、Oracle等主流数据库里都能正常工作,是通用语法。
- 过滤后的总和:如果你的查询带有
WHERE子句,SUM() OVER ()计算的是过滤后结果集的整列总和,而不是原表的全部数据,这通常也是符合预期的。 - 替代写法:有些数据库也支持
SUM(your_column) OVER (PARTITION BY NULL),但OVER()更简洁,优先推荐前者。
和GROUP BY的本质区别是:窗口函数不会改变结果集的行数,只是为每一行新增计算后的列;而GROUP BY会合并行,最终返回的是分组后的聚合结果,这正是你不需要分组操作的关键原因。
内容的提问来源于stack exchange,提问作者SUBZERO
相关产品推荐
相关产品推荐

