获取几个月的最新记录并使用 Oracle PL-SQL 为每个 ID 汇总其值

Posted

技术标签:

【中文标题】获取几个月的最新记录并使用 Oracle PL-SQL 为每个 ID 汇总其值【英文标题】:Get latest record for a period of months and aggregate its value using Oracle PL-SQL for each 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)

【问题讨论】:

请发帖minimal reproducible example。 sp_periodic_data 的代码在哪里? 【参考方案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;

【讨论】:

以上是关于获取几个月的最新记录并使用 Oracle PL-SQL 为每个 ID 汇总其值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用月份名称获取最近 3 个月的计数,如果该月份没有记录需要使用月份名称获取 0 [重复]

耗时几个月,终于找到了JVM停顿十几秒的原因

如何在postgres中对几个月的日期记录分组后填补时间间隔

oracle 中过去 12 个月的日期

Hive - 如何从 Hive 获取最近几个月的数据?

SQL 通过微秒时间戳获取过去几个月的行?