sql >> Database >  >> RDS >> Oracle

Hoe de records te verwijderen op basis van de vorige en volgende rijen en de datum toe te wijzen op basis van bepaalde voorwaarden?

De reden waarom u een foutmelding kreeg bij uw zoekopdracht, is dat voordat de subquery wordt gedefinieerd, u moet aangeven wat u eruit wilt selecteren. Dus als je dat had voorafgegaan met select * from het zou een geldige vraag zijn geweest.

Merk op dat je die or . niet hoeft te doen bewerkingen, aangezien u dat korter kunt doen met een in exploitant.

Je moet ook enkele vergelijkingen negeren (omdat je al NOT . hebt ) en kap datums af met TRUNC .

Dit is de vraag die ik zou willen voorstellen:

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))

Merk op dat de term_end_date van record 6 wordt ook gewijzigd, aangezien regel 2 hierop van toepassing is.



  1. Voorwaardelijke deelname aan SQL-server

  2. Hoe twee kolommen aan dezelfde tabel te koppelen

  3. Is het mogelijk om voor elke database in mysql-databases een query uit te voeren en resultaten op te tellen of te combineren met alleen een mysql-opdrachtomgeving?

  4. Acquire_lock() werkt niet. Bot verzendt nog steeds snel verzoeken. PHP + AJAX