2016-05-09 107 views
1

我有问题解决。我想每次在我们的数据仓库中对帐户进行更改时都会获得记录,但我只收到一个帐户。下表是我正在使用的示例。PL/SQL Oracle 11g循环

Row  Acct1 Acct2 Date  Total_Reissued Reissue_Per_Day 
1  A  1  1/1/2016 2    2 
2  A  1  1/2/2016 3    1 
3  A  1  1/3/2016 5    2 
4  A  1  1/4/2016 6    1 

1  B  3  1/1/2016 1    1 
2  B  3  1/2/2016 2    1 
1  B  4  1/1/2016 1    1 
2  B  4  1/2/2016 2    1 

重新发布的列是一个正在运行的总数。对于2016年1月1日的Acct A,有2次重发,然后在2016年1月1日还有1次再次发行,总数为3次。我的问题是计算每天重发的实际数量。

+0

请修改您的问题以包含其他信息。现在,我不知道如何从“重新发布”列中显示的内容到您在“我想要的结果”列中显示的内容。 ??? –

回答

2

您可以使用the lag() function来查看上一行;假设“以前”是你看到的acct1/acct2组合的最后一天,你可以这样做:

select row_number() over (partition by acct1, acct2 order by dt) as row_num, 
    acct1, acct2, dt, total_reissued, 
    total_reissued - nvl(lag(total_reissued) 
    over (partition by acct1, acct2 order by dt), 0) as reissue_per_day 
from your_table; 

    ROW_NUM A  ACCT2 DT   TOTAL_REISSUED REISSUE_PER_DAY 
---------- - ---------- ---------- -------------- --------------- 
     1 A   1 2016-01-01    2    2 
     2 A   1 2016-01-02    3    1 
     3 A   1 2016-01-03    5    2 
     4 A   1 2016-01-04    6    1 
     1 B   3 2016-01-01    1    1 
     2 B   3 2016-01-02    2    1 
     1 B   4 2016-01-01    1    1 
     2 B   4 2016-01-02    2    1 

我不知道,如果你的“行”列确实存在,或者是必需的,或者只是为了说明你的数据。无论如何,我已经生成了它,以防你需要它。

主要感兴趣的位:

lag(total_reissued) over (partition by acct1, acct2 order by dt) 

其中找到以前日期的值(使用dt作为列名,因为date是不是有效的名称)。然后有一个nvl()包装,所以第一行看到一个零值而不是null的虚拟值。然后从当前行的值中减去以获得差异。

+0

这正是我正在寻找的!谢谢! –