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

如何使用分析函数计算各账户BAL列的平均值?

需求:为每个账户计算BAL列的平均值

现有SQL代码

with cte as (
select distinct t.DATE_ID,
        ad.ACCOUNT_ID
        from TIMEDATE t 
         ,  ACCOUNT_DLY ad)
         
select  cte.date_id,
        cte.Account_ID, 
        NVL(current_bal,lag (ad.current_bal) ignore nulls over (PARTITION by cte.account_id order by cte.date_id )) as bal
from cte left join ACCOUNT_DLY ad
on cte.date_id = ad.SRC_EXTRACT_DT
and cte.ACCOUNT_ID = ad.ACCOUNT_ID
order by 2,1;

表结构与预期结果

当前涉及表结构

表名字段名说明
TIMEDATEDATE_ID日期ID
ACCOUNT_DLYACCOUNT_ID账户ID
ACCOUNT_DLYSRC_EXTRACT_DT数据提取日期
ACCOUNT_DLYCURRENT_BAL当前余额

预期输出结果

需在原有查询的bal列基础上,新增每个账户的bal列平均值,示例格式如下:

DATE_IDACCOUNT_IDBALAVG_BAL
20230101100110001200
20230102100112001200
20230103100114001200
202301011002500600
202301021002600600
202301031002700600

修改后的SQL方案

基于原有查询生成的bal值,通过分区分析函数计算每个账户的平均值即可,代码如下:

with cte as (
select distinct t.DATE_ID,
        ad.ACCOUNT_ID
        from TIMEDATE t 
         ,  ACCOUNT_DLY ad),
bal_cte as (
select  cte.date_id,
        cte.Account_ID, 
        NVL(current_bal,lag (ad.current_bal) ignore nulls over (PARTITION by cte.account_id order by cte.date_id )) as bal
from cte left join ACCOUNT_DLY ad
on cte.date_id = ad.SRC_EXTRACT_DT
and cte.ACCOUNT_ID = ad.ACCOUNT_ID
)
select 
    date_id,
    Account_ID,
    bal,
    AVG(bal) over (PARTITION by Account_ID) as avg_bal
from bal_cte
order by Account_ID, date_id;

逻辑说明

  1. 新增bal_cte子查询,先完成原有逻辑:补全每个账户每日的余额空值,生成bal列
  2. 外层查询通过AVG(bal) over (PARTITION by Account_ID),按账户分组计算该账户所有bal值的平均值,同一账户的所有行将显示相同的平均值结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:40:36