你不知道的sum() over()函数的作用

本文介绍了SQL的sum()over()函数,用于对数据按城市、年份分组并按月份排序后逐月累计交易额。通过创建测试表和使用示例,展示了如何在SQL查询中应用这个功能。

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

一、sum()over()函数
sum():对某个字段求和。
over():开窗,按照某种规则,将数据分组、分窗口计算。
sum()over():对某个字段有规则的求和。规则即over()中的分组、排序字段,先按照分组字段将数据分为不同的组,再按照排序字段对求和字段组内逐级累计计算
用法:sum(求和字段)over(PARTITION by 分组字段1,分组字段2。。。 order by 排序字段1。。。)
示例:sum(交易额)over(PARTITION by 城市,年份order by 月份)
示例说明:对交易额求和,此时求和非全表求和,而是将数据按照城市和年份分到不同组,且按照月份正序累计交易额。
如凉州2023年1、2、3月交易额都为100,那么2月累计为1月+2月是200,3月累计为1月+2月+3月是300.
city yearid monthid money_num sum_over
苏州 2023 01 100 100
苏州 2023 02 100 200
苏州 2023 03 100 300

二、示例

2.1准备工作

--创建测试表
create table test_sumover(
    city string COMMENT '城市',
    yearid string COMMENT  '年',
    MONTHid string COMMENT '月',
    money_num DECIMAL (18,2) COMMENT '交易额'
)
;
--写入测试数据
INSERT into test_sumover
VALUES 
 ('凉州','2023','01',100)
,('凉州','2023','02',100)
,('凉州','2023','03',100)
,('荆州','2023','01',100)
,('荆州','2023','02',100)
,('荆州','2023','03',100)
,('徐州','2023','01',100)
,('徐州','2023','02',100)
,('徐州','2023','03',100)
;
---对测试数据按照城市、年份分为不同的组,再根据月份正序逐月累计交易额。

SQL SELECT city ,yearid ,monthid ,sum(money_num )over(PARTITION by city,yearid order by monthid) sum_over from test_sumover ;

### 使用 `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、付费专栏及课程。

余额充值