oracle - 获取几个月的最新记录并使用 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)
解决方案
作为一个开始 :
例子:
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;
推荐阅读
- ios - 通过代码添加 UIView 时出现重叠问题
- linux - Linux内核模块:BUG:无法在0000000080cb7fb8处处理内核分页请求
- docker - 自托管注册表和 docker 中的自己的证书有什么风险?
- apache-spark - 无需读取整个表数据的 Spark DataFrame 示例
- c++ - Don't open terminal window while opening SDL window on OSX
- laravel - 不能用vue axios设置数据
- ios - 快速平滑圆角
- php - WordPress 仅显示具有特定父类别的帖子
- localhost - Chrome,firefox中的网络摄像头js错误:无法从远程客户端访问网络摄像头
- java - Android片段中的viewpager问题