2016-07-27 6 views
0
REG_ID| EVENT_TYPE_CD | EVENT_DATE | PACKAGE_DESC |PRODUCT_TYPE|TERM_START_DATE|TERM_END_DATE 
------|------------------|------------|-----------------|------------|---------------|---------- 

11156 | NEW SUBSCRIPTION | 23-FEB-16 | CONNECTED CARE |PAID  | 23-FEB-16  | 23-FEB-16 
11156 | CANCELLATION  | 23-FEB-16 | CONNECTED CARE |PAID  | 23-FEB-16  | 23-FEB-16 
11156 | UPSELL   | 23-FEB-16 | CONNECTED CARE |GOODWILL | 23-FEB-16  | 22-MAR-16 
11156 | CANCELLATION  | 11-MAR-16 | CONNECTED CARE |GOODWILL | 23-FEB-16  | 11-MAR-16 
11156 | UPSELL   | 14-MAR-16 | CONNECTED CARE |GOODWILL | 14-APR-16  | 13-APR-17 
11156 | EXPIRATION  | 14-APR-16 | CONNECTED CARE |GOODWILL | 14-MAR-16  | 13-APR-17 
11163 | UPSELL   | 23-FEB-16 | CONNECTED CARE |PAID  | 23-FEB-16  | 23-FEB-16 
11163 | CANCELLATION  | 23-FEB-16 | CONNECTED CARE |PAID  | 23-FEB-16  | 22-MAR-16  
17215 | NEW SUBSCRIPTION | 18-JAN-16 | CONNECTED CARE |TRIAL  | 18-JAN-16  | 17-JAN-17 
17215 | NEW SUBSCRIPTION | 18-JAN-16 | GUIDANCE  |TRIAL  | 18-JAN-16  | 17-APR-16 
17215 | CANCELLATION  | 22-FEB-16 | GUIDANCE  |TRIAL  | 18-JAN-16  | 22-FEB-16 
17215 | UPSELL   | 25-FEB-16 | GUIDANCE  |GOODWILL | 25-FEB-16  | 24-APR-16 
17215 | EXPIRATION  | 25-APR-16 | GUIDANCE  |GOODWILL | 25-FEB-16  | 24-APR-16 
17215 | NEW SUBSCRIPTION | 18-JAN-16 | REMOTE   |TRIAL  | 18-JAN-16  | 17-APR-16 
17215 | UPSELL   | 25-FEB-16 | REMOTE   |GOODWILL | 25-FEB-16  | 24-APR-16 
17215 | NEW SUBSCRIPTION | 18-JUN-16 | REMOTE   |PAID  | 18-JUN-16  | 17-JUL-16 
17215 | UPSELL   | 25-JUL-16 | REMOTE   |GOODWILL | 25-JUL-16  | 24-AUG-16 

Der Ausgang ich brauche, ist, dass alles von EVENT_DATE (Series of Events) sortiert werden mussWie die Daten und verschiedene Datensätze basierend einzustellen auf einer Säule

  1. wenn ein ‚Goodwill‘ EVENT_DATE folgt ein 'Trial' Produkt EVENT_DATE dann behandeln Sie dies als 'Trial'. Wenn ein ‚Goodwill‘ EVENT_DATE folgt ein ‚bezahlt‘ Produkt EVENT_DATE dann diese behandeln, als ‚bezahlt‘ und stellen Sie die TERM_END_DATE (Beispiel für REMOTE Ideal-Szenario, wenn es keine Stornierung oder EXPIRATION event_type_cd für bestimmte PACKAGE_DESC ist in einem REG_ID)

  2. Wenn es ein Ereignis ist nach der Absage dann Stornierung ignorieren (11163 zeigt sich: das ist der Grund, da es keine neuen Ereignis nach der Stornierung)

  3. Wenn mehrere Goodwill der sind auf den Spuren wir brauchen Nimm das Maximum TERM_END_DATE im Zyklus nee ds als TERM_END_DATE (REG_ID 17215 und GUIDANCE) zugewiesen.
  4. EXPIRATION RECORD sollte immer da sein und sein term_start_date muss an das Term_start_date des Cycle 1. Datensatz angepasst werden.
REG_ID| EVENT_TYPE_CD | EVENT_DATE | PACKAGE_DESC |PRODUCT_TYPE|TERM_START_DATE| TERM_END_DATE 
------|------------------|------------|-----------------|------------|---------------|---------- 

11156 | NEW SUBSCRIPTION | 23-FEB-16 | CONNECTED CARE |PAID  | 23-FEB-16  | 13-APR-17 
11156 | EXPIRATION  | 14-APR-16 | CONNECTED CARE |PAID  | 23-FEB-16  | 13-APR-17 
11163 | UPSELL   | 23-FEB-16 | CONNECTED CARE |PAID  | 23-FEB-16  | 23-FEB-16 
11163 | CANCELLATION  | 23-FEB-16 | CONNECTED CARE |PAID  | 23-FEB-16  | 22-MAR-16 
17215 | NEW SUBSCRIPTION | 18-JAN-16 | CONNECTED CARE |TRIAL  | 18-JAN-16  | 17-JAN-17 
17215 | NEW SUBSCRIPTION | 18-JAN-16 | GUIDANCE  |TRIAL  | 18-JAN-16  | 24-APR-16 
17215 | EXPIRATION  | 25-APR-16 | GUIDANCE  |TRAIL  | 18-JAN-16  | 24-APR-16 
17215 | NEW SUBSCRIPTION | 18-JAN-16 | REMOTE   |TRIAL  | 18-JAN-16  | 24-APR-16 
17215 | NEW SUBSCRIPTION | 18-JUN-16 | REMOTE   |PAID  | 18-JUN-16  | 24-AUG-16 
+0

@ a_horse_with_no_name -> Danke für die Bearbeitung meiner Frage zum besseren Verständnis .. :) – beckham

+0

Ich habe meine Frage zum besseren Verständnis bearbeitet. Nochmals vielen Dank für Ihre Hilfe im Voraus. – beckham

+0

Ich versuche die Sortierreihenfolge des Endergebnisses herauszufinden. Von der Tabelle, die Sie zur Verfügung gestellt haben, scheint es "reg_id, package_desc, event_date" zu sein, außer dass die 'reg_id' in Ihrer Tabelle nicht gut sortiert ist: sie geht wieder runter und wieder hoch. Außerdem gibt es immer noch zweideutige Fälle, wie die letzten beiden Zeilen in der Final Table. Wie werden sie bestellt? Basiert es auf den letzten beiden Spalten? wie: 'reg_id, package_desc, event_date, term_start_date, term_end_date'? – trincot

Antwort

2

Die Regeln sind recht umfangreich, und Ihre vielleicht bessere Ergebnisse und Leistung mit PL/SQL-Code erhalten, wie können Variablen verwenden, während über einen Cursor laufen.

Trotzdem denke ich, die folgende Abfrage kann tun, was Sie brauchen:

select reg_id, 
     event_type_cd, 
     event_date, 
     package_desc, 
     case product_type when 'GOODWILL' then coalesce(prev_product_type, 'TRIAL') 
      else product_type 
     end as product_type, 
     case event_type_cd when 'EXPIRATION' then first_term_start_date 
      else term_start_date 
     end as term_start_date, 
     case next_product_type when 'GOODWILL' then next_term_end_date 
      else term_end_date 
     end as term_end_date 
from (select reg_id, 
       event_type_cd, 
       event_date, 
       package_desc, 
       product_type, 
       term_start_date, 
       term_end_date, 
       first_value(term_start_date) over (
        partition by reg_id, package_desc 
        order by event_date, term_end_date, event_type_cd desc) as first_term_start_date, 
       lead(term_end_date, 1) over (
        partition by reg_id, package_desc 
        order by event_date, term_end_date, event_type_cd desc) as next_term_end_date, 
       lag(product_type, 1) over (
        partition by reg_id, package_desc 
        order by event_date, term_end_date, event_type_cd desc) as prev_product_type, 
       lead(product_type, 1) over (
        partition by reg_id, package_desc 
        order by event_date, term_end_date, event_type_cd desc) as next_product_type 
     from (select reg_id, 
         event_type_cd, 
         event_date, 
         package_desc, 
         product_type, 
         term_start_date, 
         term_end_date, 
         lead(product_type, 1, '-') over (
          partition by reg_id, package_desc 
          order by event_date, term_end_date, event_type_cd desc) as next_product_type 
       from mytable) 
       where not (event_type_cd = 'CANCELLATION' and next_product_type <> '-') 
       and  not (product_type = 'GOODWILL' and next_product_type = 'GOODWILL') 
       ) 
where not ( product_type = 'GOODWILL' 
       and event_type_cd not in ('EXPIRATION', 'CANCELLATION') 
       and prev_product_type is not null) 
order by reg_id, package_desc, event_date, term_end_date, event_type_cd desc 

Die Abfrage hat eine Zwei-Ebene-verschachtelte Unterabfrage.

Die Innen meisten Abfrage dient nur der product_type des nächsten Datensatzes innerhalb des Zyklus zu erhalten (das heißt innerhalb der gleichen Partition von reg_id und package_desc).

Die Mitte Abfrage verwendet diese Informationen zu beseitigen:

  • ‚Annullierung‘ Aufzeichnungen, es sei denn, sie die letzte Aufzeichnung ihres Zyklus sind;
  • Konsekutive 'GOODWILL' Aufzeichnungen, nur die letzten in jeder Sequenz verlassen - das ist das letzte ist vorübergehend, aber in diesem Stadium noch benötigt wird;

Die mittlere Abfrage auch wieder holt die product_type des nächsten Datensatzes in dem Zyklus, wie es jetzt aufgrund der eliminiert Datensätze geändert haben könnte.Darüber hinaus wird festgestellt:

  • die term_start_date des ersten Datensatzes im Zyklus;
  • die term_end_date des nächsten Datensatzes im Zyklus;
  • die product_type des vorherigen Datensatzes in dem Zyklus;

Schließlich ist die äußere Abfrage verwendet diese Informationen an:

  • stellen Sie den product_type zu dem der vorherigen Datensatz (oder ‚trial‘, wenn es keine vorherige ist), wenn es sich um eine handelt 'GOODWILL' Aufzeichnung;
  • eingestellt die term_start_date zu dem des dem ersten Datensatz in dem Zyklus, wenn es ein ‚ABLAUF‘ record betrifft;
  • Setzen Sie term_end_date auf den nächsten Datensatz im Zyklus, wenn der nächste Datensatz einen 'GOODWILL' Datensatz betrifft.

Die guten Willen 'Aufzeichnungen (vor der Änderung oben in der ersten Kugel) werden aus dem Ergebnis ausgeschlossen, es sei denn, wenn sie in ihrem Zyklus auf einen ersten Datensatz beziehen, oder auf einen ‚ABLAUF‘ oder ‚Annullierung‘ entsprechen, Aufzeichnung.

Die order by Klausel verwendet die Reihenfolge, wie Sie in den Kommentaren erwähnt, mit einem zusätzlichen event_type_cd desc um sicherzustellen, dass „Die EVENT_TYPE_CD der für die Aufhebung oder Ablauf wird das neue Abonnement oder Upsell für einen bestimmten REG_ID, PACKAGE_DESC immer folgen“. Dies liegt daran, durch das Glück beide ‚NEW-Abo‘ und ‚Upselling‘ kommen beide später in der alphabetischen Reihenfolge als ‚Annullierung‘ und ‚ABLAUF‘, so in absteigender Reihenfolge wir bekommen sie sortierte Recht.

+0

Hallo Trincot, es funktioniert wie ein Zauber. Es gab mir die gewünschte Ausgabe, wie ich für 3 reg_id's habe ich getestet habe. Ich danke dir sehr. Wieder einmal habe ich keine Worte, um dir für all deine Bemühungen zu danken. :) – beckham

+0

Hallo Trincot, ich dachte daran, dich nicht zu stören, da du mir bis jetzt sehr geholfen hast. Ich habe gestern eine andere Frage gestellt und es sieht so aus, als ob -ve Stimmen über meine Frage vorliegen, also keine Antwort. Würdest du sehen, ob mir etwas in meiner Frage fehlt und mir bei diesem Szenario helfen? :) http://stackoverflow.com/questions/38627219/how-to-delete-the-records-based-upon-prev-and-next-rows-and-assign-the-date-base – beckham

+0

Ich werde eine haben aussehen. Eine Sache, die Leute auf StackOverflow nicht mögen, ist, wenn Sie eine Frage stellen und nicht den Code zeigen, mit dem Sie versucht haben. Sie sollten immer einen Absatz wie * hinzufügen. "Ich habe es mit dieser SQL versucht ... aber es gibt mir nicht das erwartete Ergebnis. Was mache ich falsch?" * Das wird zu weniger Downstimmen führen. Es ist wichtig, dass Sie zeigen, dass Sie sich Mühe gegeben haben und die Community nicht nur bitten, die Arbeit für Sie zu erledigen. Aber ich werde Ihre Frage zuerst mit besserer Formulierung und Formatierung aktualisieren. Dann sollten Sie einen solchen Absatz hinzufügen. – trincot

Verwandte Themen