Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak usunąć rekordy na podstawie poprzednich i następnych wierszy i przypisać datę w oparciu o określone warunki?

Powodem, dla którego otrzymałeś błąd w zapytaniu, jest to, że przed zdefiniowaniem podzapytania musisz wskazać, co chcesz z niego wybrać. Więc jeśli poprzedziłeś to za pomocą select * from byłoby to prawidłowe zapytanie.

Pamiętaj, że nie musisz robić tych or operacje, ponieważ możesz to zrobić krócej za pomocą in operator.

Powinieneś także zanegować niektóre porównania (ponieważ już masz NOT ) i skróć daty za pomocą TRUNC .

Oto zapytanie, które proponuję:

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

Pamiętaj, że term_end_date z rekordu 6 jest również modyfikowany, ponieważ ma do niego zastosowanie zasada 2.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wybierz N-ty wiersz z tabeli w Oracle

  2. ORACLE TRIGGER WŁÓŻ DO ... (WYBIERZ * ...)

  3. Jak rozpoznać, który plik tnsnames.ora jest używany przez wywołanie .net?

  4. wyszukiwanie tekstu Oracle Blob

  5. Oracle SQL — Jak uzyskać różne wiersze za pomocą funkcji analitycznych RANK() lub DENSE_RANK() lub ROW_NUMBER()?