获取几个月的最新记录并使用 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 [重复]