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

Oracle शीर्ष 1 के साथ स्थिति में शामिल हों

मैं अभी भी स्पष्ट नहीं हूं कि आपके उदाहरण में आपको कौन सा रिकॉर्ड चाहिए था, इसलिए मैं आपको कुछ विकल्प देता हूं।

मुझे आपके समस्या विवरण से पता चला है कि आप उपलब्ध लोगों की नवीनतम प्रभावी तिथि चाहते हैं। चूंकि इसमें संबंध शामिल हैं, आप max() . का उपयोग नहीं कर सकते हैं (जैसा कि आप पहले ही बता चुके हैं), और row_number() जाने का रास्ता है:

with cte as (
  select
    addrid, effectdt, xpirdt,
    row_number() over (partition by addrid order by effectdt desc) as rn
  from addrdata
)
select
  addrid, effectdt, xpirdt
from cte
where rn = 1

अगला भाग वह था जहाँ आपने मुझे नल के साथ खो दिया था ... यदि आपका द्वितीयक प्रकार समाप्ति तिथि के अनुसार है और आप नवीनतम समाप्ति तिथि को रौंदने के लिए एक शून्य मान चाहते हैं, तो आप समाप्ति तिथि के अनुसार ऑर्डर करेंगे और पहले nulls first :

with cte as (
  select
    addrid, effectdt, xpirdt,
    row_number() over 
        (partition by addrid order by effectdt desc, xpirdt nulls first) as rn
  from addrdata
)
select
  addrid, effectdt, xpirdt
from cte
where rn = 1

जिसका अर्थ है कि यह पंक्ति विजेता है:

10948448    5/14/2015   <null>

यदि, हालांकि, आप चाहते हैं कि नल पर केवल तभी विचार किया जाए जब कोई समाप्ति तिथि न हो, तो आप nulls last का उपयोग कर सकते हैं (या इसे छोड़ दें, क्योंकि यह डिफ़ॉल्ट है):

with cte as (
  select
    addrid, effectdt, xpirdt,
    row_number() over
        (partition by addrid order by effectdt desc, xpirdt nulls last) as rn
  from addrdata
)
select
  addrid, effectdt, xpirdt
from cte
where rn = 1

मतलब इस आदमी ने पुरस्कार जीता है:

10948448    5/14/2015   5/13/2015

चूंकि यह row_number() . का उपयोग करता है आप कोई पंक्ति नहीं खोएंगे - प्रत्येक पंक्ति में एक पंक्ति संख्या होने की गारंटी है। यह सिर्फ इतना है कि अगर सच्चे संबंध हैं, तो यह टॉस-अप है कि कौन सी पंक्ति चुनी गई है। हालांकि, शून्य समाप्ति तिथियों के साथ आपकी समस्या के कारण इस दृष्टिकोण में कोई समस्या नहीं होनी चाहिए।

-- 2/13/16 संपादित करें --

मुझे लगता है कि मैं शुरू कर रहा हूं आपकी समस्या को समझने के लिए, लेकिन मैं 100% निश्चित नहीं हूँ। मैंने अपने सुझाव के साथ आपके कोड के स्निपेट्स को लेफ्ट जॉइन के साथ शामिल किया है, और पहले शून्य समाप्ति तिथियों की आवश्यकता है, और यह मेरी अगली दरार है:

with cte as (
  select
    addrid, effectdt, xpirdt,
    row_number() over 
        (partition by addrid order by effectdt desc, xpirdt nulls first) as rn
  from addrdata
)
select
  cte.addrid, effectdt, xpirdt
from
  mbr_person mb
  left join partyxref px on
    mb.nameid = px.nameid and
    px.reftype = 'COMM'
  left join cte on
    px.refkey = cte.addrid and
    cte.rn = 1

मान लें कि यह ऐसा नहीं करता है:

  1. जब आप कहते हैं कि एक शून्य XPIRDT को प्राथमिकता दी जाती है - क्या आपका मतलब हाल की प्रभावी तिथियों से भी अधिक है, या यह केवल सबसे हाल के EFFECTDT के लिए एक टाईब्रेकर है? यदि बाद वाला, तो मेरे पास जो है वह काम करना चाहिए। अगर पहले वाला है, तो हमें एनालिटिकल फंक्शन में ऑर्डर बाय को स्विच करना होगा
  2. जब बात partyxref की आती है तो मैं पूरी तरह से अनुमान लगा लेता हूं और mbr_person टेबल। यदि यह इसे नहीं काटता है, तो शायद उन दो तालिकाओं को शामिल करने के लिए कुछ नमूना डेटा और वांछित आउटपुट पोस्ट करें, या इसे बेला करें?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSON ऑब्जेक्ट के माध्यम से PLSQL लूपिंग

  2. ORA-29285 कैसे हल करें:फ़ाइल लिखने में त्रुटि

  3. PL SQL का उपयोग करके Oracle में डेटा एन्क्रिप्ट कैसे करें

  4. ORA-01438:3 . डालने पर इस कॉलम के लिए अनुमत निर्दिष्ट सटीकता से बड़ा मान

  5. Oracle दिनांक घटाव