sql - 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
很明显,我要么错误地对待以下运算符,要么问题隐藏在日期类型中,但无论如何我找不到解决方案。所以我的问题是我在哪里犯了错误?
感谢你的帮助
解决方案
您的日期不连续,因此您需要将它们转换为数字:
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 小提琴。
推荐阅读
- serialization - Avro Schema 用于具有随机名称的非结构化数据
- javascript - dangerouslySetInnerHTML 是否会阻止设置无效的 HTML?
- python - 如何从一个函数访问多个值,而只调用一次函数?
- html - 如何在 Safari 中对齐背景图像?
- python - pip 跳过升级,不满足时表示要求已经满足
- html - 访问 ngFor 中的不同对象
- ansible - 使用 jinja2 模板解析 ansible 中的输出(将字符串列表映射到字符串列表)
- javascript - 通过 javascript 调整 SVG viewBox 的行为
- sql - 没有 CTE 的层次结构 - 获取直接子级
- if-statement - 如果在 Haskell 中有多重条件吗?