2016-07-27 39 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 

我所需要的輸出調整日期和不重複的記錄是,一切都需要由EVENT_DATE進行排序(活動的系列)如何基於列

  1. 如果「商譽」 EVENT_DATE如下「試用」產品EVENT_DATE 然後將其視爲「試用」。如果是「金匯」 EVENT_DATE如下則 「付費」產品EVENT_DATE將此視爲「付費」,並調整 TERM_END_DATE(實施例用於遠程理想的情況下當存在一個REG_ID特定PACKAGE_DESC 沒有 取消或EXPIRATION event_type_cd)

  2. 如果有一個事件後,取消則忽略取消(11163顯示出來:是這樣的原因,因爲在取消後沒有新的 事件)

  3. 如果有多個親善的 我們需要的線索以下在 週期內取最大值TERM_END_DATE ds分配爲TERM_END_DATE(REG_ID 17215和GUIDANCE)。
  4. EXPIRATION RECORD應始終存在,其term_start_date 需要調整爲Cycle第一個 記錄的Term_start_date。
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 - >感謝編輯我的問題,以便更好地理解.. :) – beckham

+0

我編輯了我的問題,以便更好地理解。再次感謝您的幫助。 – beckham

+0

我想弄清楚最終結果的排序順序。從你提供的表格看來,它似乎是'reg_id,package_desc,event_date',只不過'reg_id'沒有在你的表格中排序好:它再次下降。此外,還有不明確的情況,如決賽桌中的最後兩行。他們如何訂購?它是基於最後兩列嗎?像:'re​​g_id,package_desc,event_date,term_start_date,term_end_date'? – trincot

回答

2

規則是相當廣泛的,並且你可能會得到更好的效果和性能PL/SQL代碼,可以使用變量,而迭代的光標。

不過,我認爲下面的查詢可能會做你的需要:

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 

查詢有兩個級別嵌套子查詢。

最內查詢僅用於獲取週期內的下一個記錄的PRODUCT_TYPE(即內的同一分區REG_IDpackage_desc)。

中間查詢使用該信息來消除:

  • 「取消」的記錄,除非他們自己的週期的最後記錄;
  • 連續的「善意」記錄,只剩下最後一個代替每個序列 - 這是最後一個是臨時的,但在這個階段仍然需要;

中間查詢還重新讀取循環中的下一個記錄的產品類型,因爲它可能現在已經由於改爲消除記錄。此外,它確定:

  • term_start_date循環中的第一個記錄的;
  • term_end_date該週期中的下一個記錄;
  • product_type以前的記錄在循環中;

最後,外部查詢使用該信息:

  • 設置PRODUCT_TYPE到以前的紀錄(或「試用」如果沒有以前的),如果它涉及'GOODWILL'記錄;
  • term_start_date設置爲循環中第一條記錄的條件,如果它涉及「到期」記錄;
  • term_end_date設置爲週期中下一條記錄的條目,前提是下一條記錄涉及「商譽」記錄。

結果中排除'GOODWILL'記錄(在上面第一個項目符號更改之前),除非它們與其週期中的第一個記錄相關或與'EXPIRATION'或'CANCELLATION'記錄。

order by子句使用你的評論中提到,有一個額外的event_type_cd desc確保「的EVENT_TYPE_CD的取消或到期將始終遵循新認購或追加銷售特定REG_ID,PACKAGE_DESC」的順序。這是因爲幸運的是'新訂閱'和'UPSELL'都是按字母順序排列,而不是'取消'和'到期日期',所以按降序順序排序。

+0

嗨Trincot,它像一個魅力。它給了我期望的輸出,因爲我已經測試了3次reg_id。非常感謝。我再一次沒有語言來感謝你的所有努力。 :) – beckham

+0

嗨Trincot,我想你不會打擾你,因爲你幫了我很多,直到現在。我昨天又發佈了一個問題,看起來好像有我的問題投票,所以沒有迴應。你能否看到我在我的問題中是否缺少某些東西,並在該情景中幫助我。 :) http://stackoverflow.com/questions/38627219/how-to-delete-the-records-based-upon-prev-and-next-rows-and-assign-the-date-base – beckham

+0

我將有一個看。有一件事StackOverflow中的人不喜歡的是當你提出一個問題時,並沒有顯示你嘗試過的代碼。你應該總是添加一個段落,如*「我用這個SQL試過了.....但它沒有給我預期的結果,我做錯了什麼?」*這將導致更少的反對票。重要的是你要表明你已經付出了努力,而不是要求社區爲你做這項工作:)但是我會首先用更好的措詞和格式更新你的問題。那麼你應該添加這樣一個段落。 – trincot