over partition by order by rows|range(2)之聚合函数

测试表如下:

create table sales_fact (
id_ number,
year number,
week number,
product varchar2(20),
country varchar2(20),
region varchar2(20),
sale number(10,2)

填充测试数据:

declare
v_id number :=1;
begin
   for v_year in 2000..2003 loop
   for v_week in 1..10 loop
   for v_product in 1..10 loop
   for v_country in 1..5 loop
   for v_region in 1..6 loop
   --dbms_output.put_line('year='||v_year||' week='||v_week||' product=product'||v_product||' );
   insert into sales_fact values(
   v_id,
   v_year,v_week,'product'||v_product,'country'||v_country,'region'||v_region,
   v_year+v_week+v_product+v_country+v_region*0.1);
   v_id := v_id +1;
   end loop;
   end loop;
   end loop;
   end loop;
   end loop;
   commit;
end;
/

示例SQL如下:

select year,week,product,country,region,sale,
sum(sale) over( --获取某个产品每年从年初到当前日期的总sale
partition by product,country,region,year 
order by week
rows between unbounded preceding and current row
) as runnign_sum_ytd,
sum(sale) over(--获取某个产品之前2周到后2周的总sale
partition by product,country,region,year 
order by week
rows between 2 preceding and 2 following
) as r5_sum_ytd
from sales_fact
where 1=1
and country in ('country1') 
and product in ('product1') 
and region='region1'
order by product,country,region,year,week;

从上面的sql可以看到,相同country、product、region、year的数据为一个分区,

然后以week进行排序,

计算两个sum值:

某个产品每年从年初到当前日期的总sale

获取某个产品之前2周到后2周的总sale

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值