2016-05-09 84 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

這正是我正在尋找的!謝謝! –