How to Delete the records based upon Prev and Next rows and assign the date based upon certain conditions

后端 未结 2 1856
清歌不尽
清歌不尽 2021-01-16 19:16

This is my insert Statements for the Source data.

REM INSERTING into EXPORT_TABLE  
SET DEFINE OFF;  
Insert into EXPORT_TABLE   values (\'4VKMH\',\'GUIDFREE         


        
2条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-01-16 19:51

    The reason why you got an error on your query is that before the sub-query is defined, you must indicate what you want to select from it. So if you had prefixed that with select * from it would have been a valid query.

    Note that you don't have to do those or operations, as you can do that shorter with an in operator.

    You should also negate some comparisons (as you already have NOT) and truncate dates with TRUNC.

    Here is the query I would suggest:

    SELECT      TEMP.REG_ID, 
                TEMP.EVENT_TYPE,
                TEMP.EVENT_DATE,
                TEMP.PRODUCT_CD,
                TEMP.TERM_START_DATE,
                CASE WHEN TEMP.EVENT_TYPE IN ('NEW SUBSCRIPTION', 'RENEWAL', 'UPSELL') 
                      AND TEMP.NEXT_EVENT_TYPE = 'CANCELLATION' THEN
                            LEAST(TEMP.TERM_END_DATE, TEMP.NEXT_TERM_END_DATE)
                     ELSE TEMP.TERM_END_DATE
                END AS TERM_END_DATE,
                TEMP.DAYS,
                TEMP.AMT
    FROM    (SELECT     REG_ID, 
                        EVENT_TYPE,
                        EVENT_DATE,
                        PRODUCT_CD,
                        TERM_START_DATE,
                        TERM_END_DATE,
                        DAYS,
                        AMT,
                        LAG(EVENT_TYPE, 1, '-') over (
                            PARTITION BY REG_ID, PRODUCT_CD
                            ORDER BY EVENT_DATE, TERM_START_DATE) as PREV_EVENT_TYPE,
                        LAG(EVENT_DATE, 1) over (
                            PARTITION BY REG_ID, PRODUCT_CD
                            ORDER BY EVENT_DATE, TERM_START_DATE) as PREV_EVENT_DATE,
                        LEAD(EVENT_TYPE, 1, '-') over (
                            PARTITION BY REG_ID, PRODUCT_CD
                            ORDER BY EVENT_DATE, TERM_START_DATE) as NEXT_EVENT_TYPE,
                        LEAD(EVENT_DATE, 1) over (
                            PARTITION BY REG_ID, PRODUCT_CD
                            ORDER BY EVENT_DATE, TERM_START_DATE) as NEXT_EVENT_DATE,  
                        LEAD(TERM_END_DATE, 1) over (
                            PARTITION BY REG_ID, PRODUCT_CD
                            ORDER BY EVENT_DATE, TERM_START_DATE) as NEXT_TERM_END_DATE
                FROM    export_table) TEMP
    WHERE   NOT (TEMP.EVENT_TYPE = 'CANCELLATION' 
                 AND TEMP.PREV_EVENT_TYPE IN ('NEW SUBSCRIPTION', 'RENEWAL', 'UPSELL') 
                 AND TRUNC(TEMP.EVENT_DATE) = TRUNC(TEMP.PREV_EVENT_DATE))
    AND     NOT (TEMP.NEXT_EVENT_TYPE = 'CANCELLATION'
                 AND TEMP.EVENT_TYPE IN ('NEW SUBSCRIPTION', 'RENEWAL', 'UPSELL') 
                 AND TRUNC(TEMP.NEXT_EVENT_DATE) = TRUNC(TEMP.EVENT_DATE))
    

    Note that the term_end_date of record 6 is also modified, as rule 2 is applicable to it.

提交回复
热议问题