oracle累计求和

 
//将当前行某列的值与前面所有行的此列值相加,即累计求和:   
//方法一:   
with t as(    
     select 1 val from dual union all    
     select 3 from dual union all    
     select 5 from dual union all    
     select 7 from dual union all    
     select 9 from dual)    
select val,    
       sum(val)    
       over (order by rownum rows between unbounded preceding and current row)    
       sum_val    
from t    
group by rownum,val    
order by rownum;    
       VAL    SUM_VAL    
---------- ----------    
         1          1    
         3          4    
         5          9    
         7         16    
         9         25    
//解析:    
//sum(val)计算累积和;    
//order by rownum 按照伪列rownum对查询的记录排序;    
//between unbounded preceding and current row:定义了窗口的起点和终点;    
//unbounded preceding:窗口的起点包括读取到的所有行;    
//current row:窗口的终点是当前行,默认值,可以省略;   
//  
//方法二:  
with cte_1 as(    
     select 1 val from dual union all    
     select 3 from dual union all    
     select 5 from dual union all    
     select 7 from dual union all    
     select 9 from dual  
     )   
,cte_2 as(  
    select rownum rn,val from cte_1  
    )  
select a.val , sum(b.val) sum_val  
from cte_2 a , cte_2 b  
where b.rn <= a.rn  
group by a.val  
/  
//方法三:  
//创建一个递归函数,求和  
//f(n) = x + f(n-1)  
create table t  
as  
select 1 id,1 val from dual union all  
select 2,3 from dual union all  
select 3,5 from dual union all  
select 4,7 from dual union all  
select 5,9 from dual  
/  
create or replace function fun_recursion(x in int)   
return integer is  
       n integer :=0;  
begin  
     select val into n   
     from t  
     where id=x;  
     if x=1 then  
        return n;  
     else  
         return n + fun_recursion(x-1);  
     end if;  
     exception  
     when others then  
          dbms_output.put_line(sqlerrm);  
end fun_recursion;  
/  
select val,fun_recursion(id) sum_val from t;  
       VAL    SUM_VAL  
---------- ----------  
         1          1  
         3          4  
         5          9  
         7         16  
         9         25  
//  
posted @   lclc  阅读(2661)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示