You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL:计算客户近4个月应付金额平均值问题求助

问题:计算客户近4个月应付金额平均值的SQL修正需求

需求说明:

  • 计算每个客户近4个月的应付金额平均值
  • 特殊情况:VENDOR_INVOICE_NUMBER=3仅存在2个月历史数据,取这2个月的平均值

用户尝试了以下Oracle SQL语句,但未得到预期结果,寻求技术建议:

select vendor_invoice_number, 
       vendor_invoice_number_1 as vendor_invoice_number_date, 
       date,
       amount_due,
       avg(amount_due) over (order by to_date(date, 'dd-mon-yy') range between interval '4' month preceding and current row) as average
from test_915
order by date desc;
问题分析与修正方案

核心问题

原SQL的窗口函数未按vendor_invoice_number(客户)分区,导致计算的是全局所有客户的近4个月金额平均值,而非单个客户的独立平均值,这是不符合需求的核心原因。另外,若date字段本身为日期类型,多余的to_date转换可能引发隐式类型转换问题。

修正后的SQL语句

select vendor_invoice_number, 
       vendor_invoice_number_1 as vendor_invoice_number_date, 
       date,
       amount_due,
       avg(amount_due) over (
           partition by vendor_invoice_number  -- 按客户分组,确保计算单个客户的独立平均值
           order by trunc(to_date(date, 'dd-mon-yy'), 'mm')  -- 按月份截断排序,匹配自然月统计逻辑
           range between interval '4' month preceding and current row
       ) as average
from test_915
order by date desc;

补充说明

  1. 若date字段本身就是DATE类型,直接使用trunc(date, 'mm')即可,无需to_date转换
  2. 对于VENDOR_INVOICE_NUMBER=3的特殊情况,窗口函数会自动取该客户已有的2个月数据计算平均值,无需额外处理
  3. 如果需求是“近4个完整自然月”而非“当前日期往前推4个月的区间”,可根据实际场景调整窗口排序或范围逻辑

内容的提问来源于stack exchange,提问作者Bruce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:50:26