2016-05-09 8 views
1

問題を解決しています。データウェアハウス内のアカウントに変更があるたびにレコードを取得していると思われますが、受け取ったのは1つだけです。以下の表は、私が取り組んでいるもののサンプルです。PL/SQL Oracle 11g Looping

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 

再発行された列は、実行中の合計です。 2011年1月1日にAcct Aに2回の再発行があった場合、1/2/2016に1回合計3回ありました。問題は1日当たりの再発行回数を計算しています。

+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

これは私が探しているものです!ありがとうございました! –