Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách xóa các bản ghi dựa trên các hàng Trước và Tiếp theo và ấn định ngày dựa trên các điều kiện nhất định

Lý do tại sao bạn gặp lỗi trong truy vấn của mình là trước khi truy vấn phụ được xác định, bạn phải chỉ ra những gì bạn muốn chọn từ nó. Vì vậy, nếu bạn đã đặt tiền tố đó bằng select * from nó sẽ là một truy vấn hợp lệ.

Lưu ý rằng bạn không phải thực hiện những or đó vì bạn có thể làm điều đó ngắn hơn với in nhà điều hành.

Bạn cũng nên phủ định một số so sánh (vì bạn đã có NOT ) và cắt bớt ngày bằng TRUNC .

Đây là truy vấn tôi muốn đề xuất:

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

Lưu ý rằng term_end_date của bản ghi 6 cũng được sửa đổi, vì quy tắc 2 có thể áp dụng cho nó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi KHÔNG VÀO thành KHÔNG TỒN TẠI

  2. Cách cài đặt nhà phát triển SQL trên máy Mac

  3. Oracle SQL - Truy vấn 2 bảng dựa trên các khóa ngoại của chúng

  4. Chuỗi truy vấn Oracle bao gồm ký tự gạch nối

  5. Có gì sai khi sử dụng windows-1252 thay vì UTF-8