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

सभी ग्राहक Oracle के लिए दिनांक कॉलम से गलत अगली तिथि प्राप्त करना

आपका विंडो क्लॉज last_effective_dates को देख रहा है आपके सभी डेटा में। आपको partition by add जोड़ना होगा इसे वर्तमान ग्राहक तक सीमित रखने का खंड:

  OVER (PARTITION BY nm.CUSTOMER_ID
        ORDER BY nm.LATEST_EFFECTIVE_DATE
        RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)

तो:

  SELECT NM.CUSTOMER_ID customer_id,
     NM.LATEST_EFFECTIVE_DATE start_date,
     NVL (
        CASE
           WHEN nm.LATEST_EFFECTIVE_DATE IS NULL
           THEN
              TO_DATE ('12/12/9999', 'dd/mm/yyyy')
           ELSE
              FIRST_VALUE (
                 nm.LATEST_EFFECTIVE_DATE)
              OVER (PARTITION BY nm.CUSTOMER_ID
                    ORDER BY nm.LATEST_EFFECTIVE_DATE
                    RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)
        END,
        TO_DATE ('12/12/9999', 'dd/mm/yyyy'))
        end_date,
     NM.PRESENT_QUANTITY PRESENT_quantity
FROM nm_cust_appliance_history nm
WHERE NM.APPLIANCE_INFO_ID = 10484
ORDER BY customer_id, start_date;

यदि आपको कभी भी इसे एक से अधिक appliance_info_id के लिए चलाने की आवश्यकता हो तो तो आपको इसे partition by clause में जोड़ना होगा भी।

आप जो देख रहे हैं उसका अनुकरण करने के लिए एक डमी अतिरिक्त रिकॉर्ड का उपयोग करना, एक सीटीई के माध्यम से आपूर्ति:

with nm_cust_appliance_history(appliance_info_id, customer_id, latest_effective_date, present_quantity) as (
  select 10484, 96, date '2009-12-20', 10 from dual
  union all select 10484, 96, date '2014-11-18', 12 from dual
  union all select 10484, 96, date '2015-11-26', 14 from dual
  union all select 10484, 42, date '2009-12-21', 15 from dual
)

आपकी मूल क्वेरी प्राप्त होती है:

CUSTOMER_ID START_DATE END_DATE   PRESENT_QUANTITY
----------- ---------- ---------- ----------------
         42 2009-12-21 2014-11-18               15
         96 2009-12-20 2009-12-21               10
         96 2014-11-18 2015-11-26               12
         96 2015-11-26 9999-12-12               14

और ऊपर दिए गए पार्टिशन-बाय क्वेरी को मिलता है:

CUSTOMER_ID START_DATE END_DATE   PRESENT_QUANTITY
----------- ---------- ---------- ----------------
         42 2009-12-21 9999-12-12               15
         96 2009-12-20 2014-11-18               10
         96 2014-11-18 2015-11-26               12
         96 2015-11-26 9999-12-12               14



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सी # ओरेकल संग्रहित प्रक्रिया पैरामीटर आदेश

  2. बिना समय के केवल तिथि जानकर तालिका से चयन करें (ORACLE)

  3. जावा का उपयोग करके Oracle डेटाबेस में IN और OUT पैरामीटर के संग्रहीत फ़ंक्शन को कैसे कॉल करें?

  4. तालिका में निकटतम मान खोजने के लिए मैं जारो-विंकलर का उपयोग कैसे कर सकता हूं?

  5. Varchar2 और char . के बीच प्रमुख अंतर क्या है?