Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

पिछली और अगली पंक्तियों के आधार पर रिकॉर्ड कैसे हटाएं और कुछ शर्तों के आधार पर तिथि निर्दिष्ट करें

आपकी क्वेरी में त्रुटि का कारण यह है कि उप-क्वेरी परिभाषित होने से पहले, आपको यह इंगित करना होगा कि आप उसमें से क्या चुनना चाहते हैं। तो अगर आपने इसके पहले select * from . लगा दिया है यह एक वैध प्रश्न होता।

ध्यान दें कि आपको वे or करने की ज़रूरत नहीं है संचालन, जैसा कि आप in . के साथ छोटा कर सकते हैं ऑपरेटर।

आपको कुछ तुलनाओं को भी नकारना चाहिए (क्योंकि आपके पास पहले से ही NOT है ) और दिनांकों को TRUNC . के साथ काटें ।

यहाँ वह प्रश्न है जो मैं सुझाऊँगा:

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

ध्यान दें कि term_end_date रिकॉर्ड 6 को भी संशोधित किया जाता है, क्योंकि नियम 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. मैं Oracle SQL डेवलपर में एक कस्टम दिनांक समय प्रारूप कैसे सेट कर सकता हूं?

  2. SUM (TO_NUMBER (varchar2 फ़ील्ड)) नहीं कर सकता:ORA 01722 [ORACLE]

  3. क्या मैं ऑरैकल में ट्रिगर के अंदर ट्रिगर अक्षम कर सकता हूं?

  4. Oracle एपेक्स 20.2 में Sql स्क्रिप्ट फ़ाइल (apex_epg_config.sql) गायब है

  5. KB में सेट किए गए SQL परिणाम का आकार निर्धारित करें