मैं अभी भी स्पष्ट नहीं हूं कि आपके उदाहरण में आपको कौन सा रिकॉर्ड चाहिए था, इसलिए मैं आपको कुछ विकल्प देता हूं।
मुझे आपके समस्या विवरण से पता चला है कि आप उपलब्ध लोगों की नवीनतम प्रभावी तिथि चाहते हैं। चूंकि इसमें संबंध शामिल हैं, आप 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
मान लें कि यह ऐसा नहीं करता है:
- जब आप कहते हैं कि एक शून्य XPIRDT को प्राथमिकता दी जाती है - क्या आपका मतलब हाल की प्रभावी तिथियों से भी अधिक है, या यह केवल सबसे हाल के EFFECTDT के लिए एक टाईब्रेकर है? यदि बाद वाला, तो मेरे पास जो है वह काम करना चाहिए। अगर पहले वाला है, तो हमें एनालिटिकल फंक्शन में ऑर्डर बाय को स्विच करना होगा
- जब बात
partyxref
की आती है तो मैं पूरी तरह से अनुमान लगा लेता हूं औरmbr_person
टेबल। यदि यह इसे नहीं काटता है, तो शायद उन दो तालिकाओं को शामिल करने के लिए कुछ नमूना डेटा और वांछित आउटपुट पोस्ट करें, या इसे बेला करें?