【问题标题】:Get latest record for a period of months and aggregate its value using Oracle PL-SQL for each ID获取几个月的最新记录并使用 Oracle PL-SQL 为每个 ID 汇总其值
【发布时间】:2021-05-26 17:21:20
【问题描述】:

我有一个将输入参数作为两个日期范围的 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 Date value
1 1-jan-2021 10
1 10-jan-2021 20
2 15-jan-2021 15
2 16-jan-2021 20
2 02-feb-2021 10
2 06-feb-2021 15
1 17-feb-2021 10
1 5-mar-2021 15
1 17-mar-2021 10
2 10-mar-2021 10

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

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

【问题讨论】:

标签: oracle plsql


【解决方案1】:

首先:

SQL for Beginners

Aggregate Functions

Analytical SQL in Oracle Database 12c

示例:

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;

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 2011-12-17
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 2012-07-16
    • 2021-02-18
    相关资源
    最近更新 更多