2016-05-09 16 views
1

Ich habe Probleme zu lösen. Ich nehme an, dass jedes Mal, wenn ein Konto in unserem Data Warehouse geändert wird, ein Datensatz erstellt wird, aber ich erhalte nur einen. Die folgende Tabelle zeigt ein Beispiel von dem, mit dem ich arbeite.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 

Die erneut ausgegebene Spalte ist eine laufende Summe. Für Acct A am 01.01.2016 gab es 2 Reissues, dann am 1/2/2016 gab es 1 weitere, die insgesamt 3 ergeben. Mein Problem ist die Berechnung der tatsächlichen Anzahl der Neuauflagen pro Tag.

+0

Bearbeiten Sie Ihre Frage, um zusätzliche Informationen hinzuzufügen. Wie es jetzt liest, verstehe ich nicht, wie Sie von dem, was Sie in der Spalte "Neu ausgegeben" zeigen, zu dem kommen, was Sie in der Spalte "Ergebnisse, die ich möchte" gezeigt haben. ??? –

Antwort

2

Sie können the lag() function verwenden, um einen Blick zurück auf die vorherige Zeile zu werfen; unter der Annahme, dass ‚früheren‘ das letzte Datum ist, dass Sie für die acct1/acct2 Kombination haben Sie tun können:

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 

ich tatsächlich existiert oder erforderlich ist, oder war nicht sicher bin, ob Ihre ‚Reihe‘ Spalte nur illustrieren Sie Ihre Daten. Ich habe es trotzdem generiert, falls Sie es brauchen.

Das Haupt wenig Interesse ist:

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

, die das frühere Datum Wert findet (dt als Spaltennamen verwendet wird, da date kein gültiger Name ist). Das hat dann einen nvl() Wrapper, so dass die erste Zeile einen Dummy-Wert von Null anstelle von Null sieht. Und dann wird das vom Wert der aktuellen Zeile subtrahiert, um die Differenz zu erhalten.

+0

Das ist genau das, wonach ich suche! Vielen Dank! –