首页 > 解决方案 > Oracle sql:对以下范围内的行求和

问题描述

假设下表名为 t1:

create table t1(
    dates date,
    prod number
);

insert into t1 values('30.09.2013', 1);
insert into t1 values('30.09.2013', 2);
insert into t1 values('22.06.2017', 1);
insert into t1 values('22.06.2017', 1);
insert into t1 values('22.06.2017', 1);
insert into t1 values('19.03.2019', 2);
insert into t1 values('18.07.2019', 1);
insert into t1 values('18.07.2019', 1);

DATE        PROD 
30.09.2013  1    
30.09.2013  2    
22.06.2017  1    
22.06.2017  1    
22.06.2017  1    
19.03.2019  2    
18.07.2019  1    
18.07.2019  1

 

我正在努力做的是在此表中添加新列,该列将对 PROD 列中的值求和,但在 2 个日期范围内,该日期大于当前行中的日期。

结果应如下所示:

DATE        PROD CNT
30.09.2013  1    5
30.09.2013  2    5
22.06.2017  1    4
22.06.2017  1    4
22.06.2017  1    4
19.03.2019  2    2
18.07.2019  1    NULL
18.07.2019  1    NULL

我正在尝试这段代码:

select t1.*, 
sum(prod) over(order by date range between 1 following and 2 following)
from t1 t1;

我得到了意想不到的结果:

DATE        PROD CNT
30.09.2013  1    NULL
30.09.2013  2    NULL
22.06.2017  1    NULL
22.06.2017  1    NULL
22.06.2017  1    NULL
19.03.2019  2    NULL
18.07.2019  1    NULL
18.07.2019  1    NULL

很明显,我要么错误地对待以下运算符,要么问题隐藏在日期类型中,但无论如何我找不到解决方案。所以我的问题是我在哪里犯了错误?

感谢你的帮助

标签: sqloracle

解决方案


您的日期不连续,因此您需要将它们转换为数字:

select t1.*, 
    sum(prod) over (order by date_num range between 1 following and 2 following)
from (select t1.*,
             dense_rank() over (order by dates) as date_num
      from t1
     ) t1;

是一个 SQL 小提琴。


推荐阅读