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

Oracle में टाइप 2 SCD को लागू करना

परिवर्तनों का पता लगाते हुए, समान स्तर वाले लगातार रिकॉर्ड को समूहबद्ध करने का एक तरीका यहां दिया गया है।

विचार तालिका में स्वयं शामिल होना है, और प्रत्येक रिकॉर्ड को अगले रिकॉर्ड से जोड़ना है जिसमें एक अलग स्तर है। यह एक NOT EXISTS . का उपयोग करके किया जाता है एक सहसंबद्ध उपश्रेणी के साथ शर्त।

LEFT JOIN अंतिम रिकॉर्ड (जो वर्तमान टियर का मालिक है) को फ़िल्टर करने से बचने के लिए आवश्यक है, जिसका अभी तक अगला रिकॉर्ड नहीं है:इस रिकॉर्ड के लिए, हम COALESCE() का उपयोग करते हैं डिफ़ॉल्ट समाप्ति तिथि सेट करने के लिए।

SELECT 
    c1.day day_from,
    COALESCE(c2.day, TO_DATE('2199-12-31', 'yyyy-mm-dd')) day_to,
    c1.Vendor_ID,
    c1.Customer_ID, 
    c1.rank
FROM customer_records c1
LEFT JOIN customer_records c2 
    ON  c2.Vendor_ID = c1.Vendor_ID
    AND c2.Customer_ID         = c1.Customer_ID
    AND c2.rank <> c1.rank
    AND c2.DAY                 > c1.DAY
    AND NOT EXISTS (
        SELECT 1
        FROM customer_records c3
        WHERE
                c3.Vendor_ID = c1.Vendor_ID
            AND c3.Customer_ID         = c1.Customer_ID
            AND c3.rank <> c1.rank
            AND c3.DAY                 > c1.DAY
            AND c3.DAY                 < c2.DAY
    )

यह रिटर्न :

 DAY_FROM  | DAY_TO    | Vendor_ID | Customer_ID | rank
 :-------- | :-------- | ------------------: | ----------: | -----------------:
 24-SEP-14 | 22-OCT-14 |            71047795 |      476095 |               3103
 01-OCT-14 | 22-OCT-14 |            71047795 |      476095 |               3103
 08-OCT-14 | 22-OCT-14 |            71047795 |      476095 |               3103
 15-OCT-14 | 22-OCT-14 |            71047795 |      476095 |               3103
 22-OCT-14 | 12-NOV-15 |            71047795 |      476095 |               3102
 29-OCT-14 | 12-NOV-15 |            71047795 |      476095 |               3102
 05-NOV-15 | 12-NOV-15 |            71047795 |      476095 |               3102
 12-NOV-15 | 31-DEC-99 |            71047795 |      476095 |               3103

अब हम अपेक्षित परिणाम उत्पन्न करने के लिए रिकॉर्ड को टियर और समाप्ति तिथि के आधार पर समूहित कर सकते हैं। ROW_NUMBER() आपको संस्करण संख्या दे सकता है। जैसा कि ऊपर बताया गया है, यह जांचना भी आसान है कि कौन सा रिकॉर्ड वर्तमान है।

SELECT 
    ROW_NUMBER() OVER(ORDER BY c2.day) version,
    DECODE(c2.day, NULL, 'Y') current_flag,
    MIN(c1.day) day_from,
    COALESCE(c2.day, TO_DATE('2199-12-31', 'yyyy-mm-dd')) day_to,
    c1.Vendor_ID,
    c1.Customer_ID, 
    c1.rank
FROM customer_records c1
LEFT JOIN customer_records c2 
    ON  c2.Vendor_ID = c1.Vendor_ID
    AND c2.Customer_ID         = c1.Customer_ID
    AND c2.rank <> c1.rank
    AND c2.DAY                 > c1.DAY
    AND NOT EXISTS (
        SELECT 1
        FROM customer_records c3
        WHERE
                c3.Vendor_Id = c1.Vendor_Id
            AND c3.Customer_ID         = c1.Customer_ID
            AND c3.rank <> c1.rank
            AND c3.DAY                 > c1.DAY
            AND c3.DAY                 < c2.DAY
    )
GROUP BY
    c1.Vendor_Id, 
    c1.Customer_ID, 
    c1.rank, 
    c2.day
ORDER BY
    day_from

परिणाम :

VERSION | CURRENT_FLAG | DAY_FROM  | DAY_TO    | Vendor_ID | Customer_ID | rank
------: | :----------- | :-------- | :-------- | ------------------: | ----------: | -----------------:
      1 | N            | 24-SEP-14 | 22-OCT-14 |            71047795 |      476095 |               3103
      2 | N            | 22-OCT-14 | 12-NOV-15 |            71047795 |      476095 |               3102
      3 | Y            | 12-NOV-15 | 31-DEC-99 |            71047795 |      476095 |               3103

Oracle में आप मेर्ज सिंटैक्स . आप अपेक्षित सभी स्तंभों पर मिलान कर सकते हैं current_flag और day_to , और अगर कोई रिकॉर्ड पहले से मौजूद है तो इन्हें अपडेट करें; अन्यथा, बस एक नया डालें।

MERGE INTO dimensions dim
USING (
   -- above query goes here --
) cust 
    ON  dim.DAY_FROM            = cust.DAY_FROM
    AND dim.vendor_id = cust.vendor_id
    AND dim.Customer_ID         = cust.Customer_ID
    AND dim.rank  = cust.rank
WHEN MATCHED THEN UPDATE SET 
    dim.DAY_TO = cust.DAY_TO,
    dim.CURRENT_FLAG = cust.CURRENT_FLAG
WHEN NOT MATCHED THEN 
    INSERT (
        dim.DAY_FROM, 
        dim.VERSION, 
        dim.CURRENT_FLAG, 
        dim.DAY_FROM, 
        dim.DAY_TO, 
        dim.vendor_id, 
        dim.customer_id, 
        dim.rank
    ) VALUES (
        cust.DAY_FROM, 
        cust.VERSION, 
        cust.CURRENT_FLAG, 
        cust.DAY_FROM, 
        cust.DAY_TO, 
        cust.vendor_id, 
        cust.Customer_ID, 
        cust.rank
    )


  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. ODP.NET आउटपुट स्ट्रिंग पैरामीटर मान वापस नहीं करता है

  3. oracle को nodejs से कनेक्ट करें

  4. किसी फ़ाइल में DBMS_OUTPUT.PUT_LINE के आउटपुट को पुनर्निर्देशित कैसे करें?

  5. किसी अन्य डेटाबेस लिंक से लिंक करना संभव है?