我想通过sql查询实现以下输出 下面是oracle表中的数据
date 1 date 2 amt1 amt2
1/1/2012 12/31/2012 100 100
1/1/2013 11/31/2013 100 100
1/1/2014 9/31/2014 50 100
1/1/2015 12/31/2015 20 100
date 1 date 2 amt1 amt2
1/1/2012 12/31/2013 100 100
1/1/2014 12/31/2014 50 100
1/1/2015 12/31/9999 20 100
获取输出的逻辑是,如果多个记录的金额相同,则输出中应存在单个记录,最早的日期为date1。写入输出的记录的日期2应该是下一个记录生效日期减1,如果没有找到下一个记录,则日期2应默认为31-dec-9999
(注意:每当两条记录之间的amt1或amt 2发生变化时,应将这些变更视为单独的记录,如果所有记录的amts相同,则输出中应存在单条记录)
请告诉我如何通过sql查询实现此输出
答案 0 :(得分:0)
此解决方案使用子查询为AMT1和AMt2的每个排列聚合单个行。然后它应用分析LEAD()函数来获取下一个DATE1并根据规范对其进行操作。
with yt as (
select amt1
, amt2
, min(date1) as date1
, max(date2) as date2
from your_table
group by amt1
, amt2
)
select yt.date1
, nvl(lead(yt.date1) over (order by yt.date1)-1, date '9999-12-31') as date2
, amt1
, amt2
from yt
order by yt.date1
/
当我在不可避免的SQL小提琴中使用它时,我必须纠正你的数据(糟糕的日期); find it here