sum over()用法,以及与group by的区别

本文详细介绍了SQL中的sumover()函数,包括其用法和示例。sumover()按指定列进行分组并排序,实现连续求和。对比groupby,sumover()只分组不进行去重,因此结果可能包含多行。举例说明了两者的区别,展示了在实际数据操作中的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、sum over()使用方法

sum(col1) over(partition by col2 order by col3 )

以上的函数能够理解为:按col2 进行分组(partition ),每组以col3 进行排序(order),并进行 连续 加总(sum)

表a,内容例如以下:
B C D
02 02 1
02 03 2
02 04 3
02 05 4
02 01 5
02 06 6
02 07 7
02 03 5
02 02 12
02 01 2
02 01 23

运行:SELECT b, c, d, SUM(d) OVER(PARTITION BY b,c ORDER BY d) e FROM a

得到结果:

B C E
02 01 2
02 01 7
02 01 30
02 02 1
02 02 13
02 03 2
02 03 7
02 04 3
02 05 4
02 06 6
02 07 7

能够看到,E列的值是累加和。如果再over()里没有order by ,则结果就是分组的求和,而不是累计求和。

2、与group by 的差别

相同的a表:select b,c,sum(d) e from a group by b,c

B C E
02 01 30
02 02 13
02 03 7
02 04 3
02 05 4
02 06 6
02 07 7

差别非常明显。

3. 具体原因

sum over() 和group by 都有分组的功能,但是group by 还有去重的功能,而sum over()只是分组,没有去重,所以就会出现有多行值,就会出现几个结果的原因。

### 使用 `SUM OVER` 的背景语法 在 SQL 中,`SUM OVER` 是一种窗口函数 (Window Function),用于计算一组数据的累积总和而不减少原始表中的行数。这种功能特别适用于需要按特定顺序或分组进行累加的情况。 #### 基本语法 以下是 `SUM OVER` 函数的标准语法: ```sql SUM(expression) OVER ( [PARTITION BY partition_expression] [ORDER BY sort_expression] [ROWS|RANGE frame_specification] ) ``` - **expression**: 被求和的目标列或表达式[^1]。 - **PARTITION BY**: 定义分区逻辑,即将数据划分为多个子集,在每个子集中独立应用聚合操作[^2]。 - **ORDER BY**: 指定累计的方向或顺序。 - **frame_specification**: 可选参数,定义窗口框架范围,例如当前行之前的行、之后的行或者整个分区内的所有行。 #### 示例代码 假设有一个名为 `sales` 的表格,其中包含以下字段: - `id`: 销售记录 ID - `date`: 销售日期 - `amount`: 销售金额 下面是一个简单的例子,展示如何使用 `SUM OVER` 来计算每日销售金额的累计总额: ```sql SELECT id, date, amount, SUM(amount) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_sum FROM sales; ``` 在这个查询中: - `SUM(amount)` 计算的是销售额的总计。 - `OVER (ORDER BY date ...)` 表明按照日期排序并逐日累加。 - `ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW` 明确指定了窗口框架为从第一条记录到当前记录之间的所有行。 如果希望基于某个分类(比如地区)来分别统计,则可以加入 `PARTITION BY` 子句: ```sql SELECT region, date, amount, SUM(amount) OVER (PARTITION BY region ORDER BY date) AS regional_cumulative_sum FROM sales; ``` 此语句会针对不同区域单独计算其各自的累计销售量。 ### 性能优化建议 当处理大规模数据集时,应考虑性能影响因素。利用监控工具分析执行计划可以帮助识别潜在瓶颈,并调整设置以提高效率。此外,适当索引设计能够加速排序过程以及提升整体查询速度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值