首页 > 解决方案 > 获取几个月的最新记录并使用 Oracle PL-SQL 为每个 ID 汇总其值

问题描述

我有一个将输入参数作为两个日期范围的 Oracle 存储过程。例如

sp_periodic_data(p_from_date DATE, p_to_date DATE) // let's take p_from_date = 01-Jan-2021 and p_to_date = '03-31-2021'

我需要从表中选择每个月的最新记录并添加其对应的时间段值。

表值:

ID 日期 价值
1 2021 年 1 月 1 日 10
1 2021 年 1 月 10 日 20
2 2021 年 1 月 15 日 15
2 2021 年 1 月 16 日 20
2 2021 年 2 月 2 日 10
2 2021 年 2 月 6 日 15
1 2021 年 2 月 17 日 10
1 2021 年 3 月 5 日 15
1 2021 年 3 月 17 日 10
2 2021 年 3 月 10 日 10

预期输出:需要为每个ID添加1月到3月之间每个月的最新记录(最新日期)

40 --> for ID 1 (20+10+10)
45 --> for ID 2 (20+15+10)

标签: oracleplsql

解决方案


作为一个开始 :

初学者的 SQL

聚合函数

Oracle Database 12c 中的分析 SQL

例子:

with 
list_dates(id,dates,value) as
(
select 1,'1-jan-2021',10  from dual union all
select 1,'10-jan-2021',20 from dual union all
select 2,'15-jan-2021',15 from dual union all
select 2,'16-jan-2021',20 from dual union all
select 2,'02-feb-2021',10 from dual union all
select 2,'06-feb-2021',15 from dual union all
select 1,'17-feb-2021',10 from dual union all
select 1,'5-mar-2021',15  from dual union all
select 1,'17-mar-2021',10  from dual union all
select 2,'10-mar-2021',10  from dual
)
,step1 as (
select 
id, trunc(to_date(dates,'dd-mon-yyyy'),'mm') mm,max(value) keep(dense_rank last order by to_date(dates,'dd-mon-yyyy')) value
from list_dates
group by id ,trunc(to_date(dates,'dd-mon-yyyy'),'mm')
)
select id,sum(value) val from step1
group by id;

推荐阅读