作者:YY666JAME_381 | 来源:互联网 | 2022-12-02 08:17
我正在使用Oracle,目前无法实现我需要的查询.
假设我有下表:
- ID Date Type Value
- 1 01/12/2016 prod 1
- 2 01/01/2017 test 10
- 3 01/06/2017 test 20
- 4 01/12/2017 prod 30
- 5 15/12/2017 test 40
- 6 01/01/2018 test 50
- 7 01/06/2018 test 60
- 8 01/12/2018 prod 70
我需要在"prod"TYPES +最后一个"prod"VALUE之间加总值.结果应该是:
- 1 01/01/2016 - 1
- 2 01/01/2017 - 60
- 3 01/06/2017 - 60
- 4 01/12/2017 - 60
- 5 15/12/2017 - 220
- 6 01/01/2018 - 220
- 7 01/06/2018 - 220
- 8 01/12/2018 - 220
我首先要在不考虑TYPES的情况下按年计算VALUES.需求发生了变化,我不知道如何开始识别每一行,即前一个"prod"DATE并将每个VALUE相加,包括最后一个"prod"TYPE.
谢谢
1> Gordon Linof..:
您可以使用累计和来定义组type = 'PROD'
- 反过来,然后使用窗口函数进行最终求和:
select t.*,
sum(value) over (partition by grp) as total
from (select t.*,
sum(case when type = 'PROD' then 1 else 0 end) over (order by id desc) as grp
from t
) t
order by id;
要查看分组逻辑,请查看:
ID Date Type Value Grp
1 01/12/2016 prod 1 3
2 01/01/2017 test 10 2
3 01/06/2017 test 20 2
4 01/12/2017 prod 30 2
5 15/12/2017 test 40 1
6 01/01/2018 test 50 1
7 01/06/2018 test 60 1
8 01/12/2018 prod 70 1
这标识了需要求和的组.这DESC
是因为"prod" 结束了一个群体.如果"prod"开始一个组(即包含在下一行的总和),那么ASC
将被使用.
Rextester演示