Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cara Menghapus catatan berdasarkan baris Sebelumnya dan Berikutnya dan menetapkan tanggal berdasarkan kondisi tertentu

Alasan mengapa Anda mendapatkan kesalahan pada kueri Anda adalah karena sebelum sub-kueri ditentukan, Anda harus menunjukkan apa yang ingin Anda pilih darinya. Jadi jika Anda telah mengawalinya dengan select * from itu akan menjadi kueri yang valid.

Perhatikan bahwa Anda tidak perlu melakukan or operasi, karena Anda dapat melakukannya lebih pendek dengan in operator.

Anda juga harus meniadakan beberapa perbandingan (karena Anda sudah memiliki NOT ) dan potong tanggal dengan TRUNC .

Inilah kueri yang saya sarankan:

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

Perhatikan bahwa tanggal_akhir_jangka catatan 6 juga dimodifikasi, karena aturan 2 berlaku untuknya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana menghubungkan database Oracle 11G menggunakan pengembang SQL dari komputer lain dalam koneksi LAN

  2. Oracle SQL untuk mengubah tipe kolom dari angka menjadi varchar2 saat berisi data

  3. Membaca BLOB menggunakan JDBC Spring tanpa set hasil

  4. Bagaimana Anda mengetahui URL database Oracle?

  5. Memulai Blogging Untuk HTML5 dan CSS3