根据逻辑选择下一个记录日期减1

时间:2014-07-23 03:46:05

标签: oracle date-arithmetic

我想通过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查询实现此输出

1 个答案:

答案 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