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

दो तालिकाओं को मिलाएं और अतिव्यापी तिथियां और अंतराल खोजें

विश्लेषणात्मक lead() . का उपयोग करते हुए यह क्वेरी काम करता है। कॉलम note दिखाता है कि पंक्ति आपके डेटा से आती है या यदि उसमें अंतर नहीं है:

select id, d1, d2, case dir when 3 then 'GAP' end note 
  from (
    select id, 
           case when dir = 2 
                 and lead(dir) over (partition by id order by dt) = 1
                 and lead(dt) over (partition by id order by dt) <> dt + 1
                then dt + 1 
                else dt
           end d1,
           case when dir = 2 
                 and lead(dir) over (partition by id order by dt) = 1
                 and lead(dt) over (partition by id order by dt) <> dt + 1
                then 3 
                else dir
           end dir,
           case when lead(dir) over (partition by id order by dt) = 1 
                then lead(dt)  over (partition by id order by dt) - 1
                else lead(dt)  over (partition by id order by dt) 
            end d2
      from (
        select * from a unpivot (dt for dir in (validfrom as 1, validto as 2)) union 
        select * from b unpivot (dt for dir in (validfrom as 1, validto as 2)) ) )
  where dir in (1, 3)

पहली बार में सभी तिथियों को एक कॉलम में रखने के लिए डेटा को अप्रकाशित किया जाता है, आगे के विश्लेषण के लिए यह आसान है। संघ डुप्लिकेट किए गए मानों को हटा देता है। कॉलम dir सूचित करता है कि क्या यह from है या from दिनांक। फिर lead इस दिशा के प्रकार के आधार पर तर्क लागू किया जाता है। मुझे लगता है कि इसे कुछ हद तक सरल बनाया जा सकता है :)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. plsql में एक मैट्रिक्स को इनिशियलाइज़ कैसे करें

  2. पीएल/एसक्यूएल को ठीक से कैसे आउटपुट करें

  3. एक ऑटोनंबर बनाने के लिए Oracle ट्रिगर

  4. रेल मॉडलिंग:एचएबीटीएम को has_many में परिवर्तित करना:के माध्यम से

  5. Oracle का ODP.Net न्यूलाइन्स को हैंडल नहीं कर सकता। नेट न्यूलाइन्स?