Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQL zum Generieren regelmäßiger Snapshots aus der Transaktionstabelle

Okay, das wird schwer zu erklären sein.

An jedem Datum für jeden Status sollten Sie zwei Werte hochzählen:

  • Die Anzahl der Kunden, die mit diesem Status beginnen.
  • Die Anzahl der Kunden, die mit diesem Status gehen.

Der erste Wert ist einfach. Es ist nur die Aggregation der Transaktionen nach Datum und Status.

Der zweite Wert ist fast genauso einfach. Sie erhalten das Vorherige Statuscode und zählen Sie, wie oft dieser Statuscode an diesem Datum "verlässt".

Dann ist der Schlüssel die kumulative Summe des ersten Werts minus der kumulativen Summe des zweiten Werts.

Ich gebe offen zu, dass der folgende Code nicht getestet ist (wenn Sie eine SQL-Fiddle hätten, würde ich sie gerne testen). Aber so sieht die resultierende Abfrage aus:

select status_dte, status_cd,
       (sum(inc_cnt) over (partition by status_cd order by status_dt) -
        sum(dec_cnt) over (partition by status_cd order by status_dt)
       ) as dateamount
from ((select t.status_dt, t.status_cd, count(*) as inc_cnt, 0 as dec_cnt
       from transactions t
       group by t.status_dt, t.status_cd 
      ) union all
      (select t.status_dt, prev_status_cd, 0, count(*)
       from (select t.*
                    lag(t.status_cd) over (partition by t.account_id order by status_dt) as prev_status_cd
             from transactions t
            ) t
       where prev_status_cd is null
       group by t.status_dt, prev_status_cd
      ) 
     ) t;

Wenn Sie Daten haben, an denen sich für einen oder mehrere Status und keine Änderung ergibt Sie möchten diese in die Ausgabe aufnehmen, dann müsste die obige Abfrage cross join verwenden um zuerst die Zeilen in der Ergebnismenge zu erstellen. Es ist unklar, ob dies eine Anforderung ist, daher lasse ich diese Komplikation weg.