求移动累计值

在银行存款和取款记录表中,求最近3条范围内的累计值。

select prc_date,prc_amt,sum(prc_amt) over(order by prc_date rows 2 preceding) as onhand_amt
 from accounts;
<think>好的,用户想了解SQL中累计窗口函数的使用方法和示例。首先,我需要回顾一下窗口函数的基本概念,特别是累计相关的部分。根据引用[1]和[2],累计窗口函数通常属于聚合开窗函数,比如SUM、AVG等,结合OVER子句中的窗口框架来实现累计计算。 用户提到“累计开窗函数”,可能需要具体的函数名称和使用场景。常见的累计函数包括SUM、AVG配合ORDER BY和ROWS/RANGE子句。比如SUM(sales) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)来计算累计销售额。 接下来要考虑用户可能的实际应用场景,比如销售数据的累计、每月平均的累计计算等。需要提供清晰的示例,说明如何编写这些查询。同时,根据引用[4]中的注意事项,生成的列名不能在WHERE等子句直接使用,可能需要子查询,但用户的问题主要是用法和示例,暂时不需要深入这点。 需要确保示例覆盖不同的情况,比如按分区、不同的窗口范围(如当前行到后续行)。另外,引用[2]提到的LEAD和LAG可能也属于累计的一种,但用户可能更关注SUM和AVG。还要注意MySQL和SQL标准的差异,但用户没有指定数据库,所以保持通用。 最后,生成相关问题,帮助用户进一步学习,比如优化方法或应用场景。确保回答结构清晰,分点说明,并标注引用来源。</think>### SQL累计窗口函数的使用方法及示例 累计窗口函数用于对数据进行**按顺序累计计算**,常用于分析时间序列数据、销售额累计、业绩增长等场景。核心方法是使用`OVER`子句定义窗口范围,结合`ORDER BY`和`ROWS/RANGE`子句控制累计逻辑。 #### 一、常用累计窗口函数 1. **累计和**:`SUM() OVER()` 2. **累计平均**:`AVG() OVER()` 3. **累计最大/最小**:`MAX()/MIN() OVER()` 4. **动态排名**:`ROW_NUMBER()/RANK() OVER()` #### 二、语法规则 ```sql 函数名(字段) OVER ( PARTITION BY 分组字段 ORDER BY 排序字段 ROWS/RANGE BETWEEN 起始行 AND 结束行 ) ``` - **`PARTITION BY`**:按字段分组,独立计算每组累计[^2] - **`ORDER BY`**:定义累计顺序(必须与`ROWS/RANGE`配合使用) - **`ROWS/RANGE`**:定义窗口范围,如`UNBOUNDED PRECEDING`(无限往前)、`CURRENT ROW`(当前行)[^4] #### 三、使用示例 **示例表**:`sales_data` | month | sales | |-------|-------| | 1 | 100 | | 2 | 150 | | 3 | 200 | 1. **基础累计和**(按月累计销售额) ```sql SELECT month, sales, SUM(sales) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_sales FROM sales_data; ``` **结果**: | month | sales | cumulative_sales | |-------|-------|-------------------| | 1 | 100 | 100 | | 2 | 150 | 250 | | 3 | 200 | 450 | 2. **分组累计平均**(按季度分组累计) ```sql SELECT quarter, sales, AVG(sales) OVER ( PARTITION BY quarter ORDER BY month RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS cumulative_avg FROM sales_data; ``` 3. **动态窗口范围**(计算最近3个月的移动累计) ```sql SELECT month, sales, SUM(sales) OVER ( ORDER BY month ROWS BETWEEN 2 PRECEDING AND CURRENT ROW ) AS rolling_sum FROM sales_data; ``` #### 四、注意事项 1. **窗口定义顺序**:必须同时使用`ORDER BY`和`ROWS/RANGE`才能实现累计逻辑 2. **性能优化**:大数据量时,合理使用`PARTITION BY`和索引字段提升查询效率 3. **兼容性**:MySQL 8.0+、PostgreSQL、SQL Server等主流数据库均支持[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄宝康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值