मैंने एक सरणी से ऑब्जेक्ट "यूनिट" प्राप्त करने की इजाजत देने वाली एक कोल्डफ्यूजन स्क्रिप्ट बनाई।

मेरे डीबी में इकाइयों के बारे में एक विचार है। एक ही इकाई कुंजी "ORG_ID" के लिए, इसमें कई पंक्तियाँ मौजूद हो सकती हैं (फ़ील्ड "मूल" पर अंतर के साथ)। फ़ील्ड "मूल" "वर्तमान", "इतिहास" या "अलग" हो सकता है।

+---------+---------+------------+------------+----------|
|  ORG_ID |  TITLE  | VALID_FROM | VALID_TO   |  ORIGIN  |
+---------+---------+------------+------------+----------|
| 1234    | A.1     | 01/03/2016 | 31/12/9999 | other    |
| 1234    | A.1     | 01/03/2016 | 31/12/3333 | current  |  
| 1234    | A.1     | 01/03/2016 | 31/12/9999 | history  |  
| 5420    | A.2     | 01/01/2014 | 31/12/3333 | other    |
| 9876    | A.3     | 01/03/2016 | 31/12/3333 | current  |  
| 9876    | B.3     | 01/03/2016 | 31/12/9999 | history  |  
| 5527    | A.1     | 01/03/2016 | 31/12/2199 | current  |
| 5527    | D.2     | 01/01/2010 | 31/12/2015 | history  |  
| 5527    | A.1     | 01/01/2016 | 31/12/2199 | history  |  
| 6699    | E.5     | 01/01/2016 | 31/12/2017 | history  |
| 6699    | A.4     | 01/01/2017 | 31/12/2018 | history  |    
+---------+---------+------------+------------+----------|

इस मामले में उदाहरण के लिए यहां वह परिणाम है जो मैं प्राप्त करना चाहता हूं:

+---------+---------+------------+------------+----------|--------------|
|  ORG_ID |  TITLE  | VALID_FROM | VALID_TO   |  ORIGIN  | CORRECT_VERS |
+---------+---------+------------+------------+----------|--------------|
| 1234    | A.1     | 01/03/2016 | 31/12/9999 | other    |      0       |    
| 1234    | A.1     | 01/03/2016 | 31/12/3333 | current  |      1       |  
| 1234    | A.1     | 01/03/2016 | 31/12/9999 | history  |      0       |  
| 5420    | A.2     | 01/01/2014 | 31/12/3333 | other    |      1       |
| 9876    | A.3     | 01/03/2016 | 31/12/3333 | current  |      1       |  
| 9876    | B.3     | 01/03/2016 | 31/12/9999 | history  |      0       |  
| 5527    | A.1     | 01/03/2016 | 31/12/2199 | current  |      1       |
| 5527    | D.2     | 01/01/2010 | 31/12/2015 | history  |      0       |  
| 5527    | A.1     | 01/01/2016 | 31/12/2199 | history  |      0       |  
| 6699    | E.5     | 01/01/2016 | 31/12/2017 | history  |      0       |
| 6699    | A.4     | 01/01/2017 | 31/12/2018 | history  |      0       |    
+---------+---------+------------+------------+----------+--------------|

मेरी कोल्डफ़्यूज़न स्क्रिप्ट: dataUnitArray में एक सरणी में इकाइयों की सूची है

<cftry>         

    <cfset hist = 0/>
    <cfset unit = structNew() />    

    <cfloop index="i" from="1" to="#ArrayLen(dataUnitArray)#">  

        <cfif #dataUnitArray[i].ORIGIN# EQ "current">
            <!---  Unit is current  --->
            <cfscript>
                unit.ORG_ID = #dataUnitArray[i].ORG_ID#;        
                unit.TITLE = #dataUnitArray[i].TITLE#;      
                unit.UNIT_VALID_FROM = #dateFormat(dataUnitArray[i].UNIT_VALID_FROM, 'DD/MM/YYYY')#;    
                unit.UNIT_VALID_TO = #dateFormat(dataUnitArray[i].UNIT_VALID_TO, 'DD/MM/YYYY')#;        
                unit.ORIGIN = #dataUnitArray[i].ORIGIN#;        

                return unit;
            </cfscript>     

        <cfelse>
            <cfif #dataUnitArray[i].ORIGIN# EQ "history">
                <!---  Unit is history  --->
                <cfscript>
                    unit.ORG_ID = #dataUnitArray[i].ORG_ID#;        
                    unit.TITLE = #dataUnitArray[i].TITLE#;      
                    unit.UNIT_VALID_FROM = #dateFormat(dataUnitArray[i].UNIT_VALID_FROM, 'DD/MM/YYYY')#;    
                    unit.UNIT_VALID_TO = #dateFormat(dataUnitArray[i].UNIT_VALID_TO, 'DD/MM/YYYY')#;        
                    unit.ORIGIN = #dataUnitArray[i].ORIGIN#;        
                </cfscript>

                <cfset hist++ >

            <cfelse>
            <!---  Unit is different (other) --->
                <cfif hist EQ 0>

                    <cfscript>
                        unit.ORG_ID = #dataUnitArray[i].ORG_ID#;        
                        unit.TITLE = #dataUnitArray[i].TITLE#;      
                        unit.UNIT_VALID_FROM = #dateFormat(dataUnitArray[i].UNIT_VALID_FROM, 'DD/MM/YYYY')#;    
                        unit.UNIT_VALID_TO = #dateFormat(dataUnitArray[i].UNIT_VALID_TO, 'DD/MM/YYYY')#;        
                        unit.ORIGIN = #dataUnitArray[i].ORIGIN#;        
                    </cfscript>
                </cfif>
            </cfif>

        </cfif>     

    </cfloop>

    <cfscript>
        return unit;
    </cfscript>

    <cfcatch type="any">                
        <cfscript>
            .....
        </cfscript>         
    </cfcatch>
</cftry>

मेरी स्क्रिप्ट सही ढंग से काम कर रही है। लेकिन जब मैंने इसे बहुत सारे डेटा पर इस्तेमाल किया तो मुझे लोडिंग समय की समस्या है। इसलिए मैं इसे सीधे ORACLE में करना चाहूंगा, CASE के साथ... जब:

CASE
    when ORIGIN = 'current' THEN 1 
    WHEN ORIGIN = 'history' THEN
        CASE  hist = 0 THEN ....

        END
ELSE 
   0   
END  AS "IS_CORRECT_VERSION"   

मैं सही इकाई संस्करण को पुनः प्राप्त करने के लिए एक नया कॉलम "CORRECT_VERSION" (संस्करण सही होने पर मान 0 या 1) जोड़ना चाहता हूं।

लेकिन मुझे नहीं पता कि यह कैसे करना है, क्या आप कृपया इसमें मेरी मदद कर सकते हैं?

आपकी सहायता के लिये पहले से ही धन्यवाद।

सेब

1
coeurdange57 12 अगस्त 2019, 14:11

2 जवाब

सबसे बढ़िया उत्तर

मैं कोल्डफ्यूजन नहीं जानता, लेकिन मुझे लगता है कि मैं तर्क को समझ गया हूं। प्राथमिकता वर्तमान> इतिहास> अलग है। यह स्पष्ट नहीं है कि कौन सी पंक्ति सही है जब दो current पंक्तियाँ या केवल different पंक्तियाँ हैं, इसलिए मैं ऐसे मामले में न्यूनतम valid_from के साथ पंक्ति को चिह्नित करता हूँ। अगर आपको परवाह नहीं है तो आप इस पैरामीटर को छोड़ सकते हैं (unit_valid_from को row_number के order by क्लॉज से हटा दें):

select units.*, 
       case when 1 = 
           row_number() over (
               partition by org_id 
               order by case origin when 'current' then 1 when 'history' then 2 else 3 end, 
                        unit_valid_from ) then 1 else 0 end as is_correct_version
  from units

dbfiddle डेमो

2
Ponder Stibbons 12 अगस्त 2019, 15:55

मुझे लगता है कि एक ही org_id के लिए समान मूल वाली कोई दो पंक्तियाँ नहीं हैं और यदि डुप्लिकेट मौजूद हैं, तो भी केवल एक रिकॉर्ड होना चाहिए जिसमें VALID_FROM

नमूना डेटा के आधार पर समाधान निम्नलिखित है। यदि आवश्यक हो तो कृपया तर्क बदलें।

SELECT
    UNITS.*,
    CASE
        WHEN DENSE_RANK() OVER(
            PARTITION BY ORG_ID
            ORDER BY
                CASE ORIGIN
                    WHEN 'current'   THEN 1
                    WHEN 'history'   THEN 2
                    ELSE 3
                END
        ) = 1
             AND TRUNC(SYSDATE) BETWEEN VALID_FROM AND VALID_TO THEN 1
        ELSE 0
    END AS IS_CORRECT_VERSION
FROM
    UNITS;

चीयर्स !!

2
Tejash 12 अगस्त 2019, 17:00