परिणाम सेट में केवल एक पंक्ति प्राप्त करने के लिए तर्क - एसक्यूएल, tsql, sql-server-2012

am stuck at point to build the logic. Can anyone help me ?

आवश्यकता:

PrivacyType = "प्राथमिक पता" के लिए यदि वहां है> 1 पंक्ति जहां SI0_ADDR.ADDR_TYPE_CODE = "M", उस पंक्ति को प्रदर्शित करें जहां currentDate () SI0_ADDR.ADDR_EFF_DATE और SI0_ADDR.ADDR_EXPR_DATE के बीच है।

मेरी क्वेरी है:

select STU_ID
,case when Privacyflag = "" then "N"
else Privacyflag
end Privacyflag
,type from (
select a.STU_ID,Privacyflag,a.type
,ROW_NUMBER() OVER ( ORDER BY ADDR_EXPR_DATE DESC) disp_nm  from (
select ad.STU_ID, case when ad.ADDR_TYPE_CODE = "M" then ad.ADDR_PRIVACY_FLAG
when ad.ADDR_TYPE_CODE=""  then "N"
end Privacyflag, "Primary Phone" type
, case when ADDR_EXPR_DATE = "1900-01-01" then "2100-12-31"
else ADDR_EXPR_DATE
end as ADDR_EXPR_DATE

from SI0_ADDR ad
where ad.STU_ID = @studentid ) a
where Privacyflag is not null
) ab
where ab.disp_nm = "1"

यह तर्क कुछ मामलों में काम नहीं कर रहा है

उत्तर:

जवाब के लिए 0 № 1

आप किसी भी तरह से तिथि से अर्हता प्राप्त नहीं कर रहे हैं, जो आपकी आवश्यकताओं का हिस्सा था। आपकी क्वेरी को इतने सारे नेस्टेड उप-प्रश्नों की आवश्यकता नहीं है। PrivacyFlag ऐसा लगता है कि यह आपके प्रश्न का हिस्सा नहीं है, इसलिए मैंने इसे इस उदाहरण में काम नहीं किया। और आपका उदाहरण दिखाता है Primary Phone, लेकिन आपका प्रश्न इस बारे में बात करता है Primary Address, इसलिए मुझे यकीन नहीं है कि इसे कैसे काम करना है।

किसी भी मामले में, यहां एक बहुत ही सरल उदाहरण है जो डेटा दिखाता है, और कैसे खींचें एक नवीनतम समाप्ति तिथि के साथ रिकॉर्ड करें, और नवीनतम प्रभावी तिथि (यदि एक ही समाप्ति तिथि के साथ दो रिकॉर्ड हैं)।

create table #temp (stu_id int, type varchar(10), address varchar(50), eff_date datetime, expr_date datetime)

insert into #temp values
(1, "primary", "123 NW 52nd", "1/1/2016", "1/1/1900"),
(1, "primary", "942 SE 33rd", "1/2/2016", "12/31/2016"),
(1, "primary", "721 SW 22nd", "4/1/2015", "1/1/1900")

select top 1 *
from   (
select stu_id
,type
,address
,eff_date
,case when expr_date = "1/1/1900" then "12/31/2100" else expr_date end as expr_date
from   #temp
where  stu_id = 1
and  type = "primary"
) as a
where  getdate() between eff_date and expr_date
order by a.expr_date desc, a.eff_date desc

drop table #temp

आप इसे शून्य उप-प्रश्नों के साथ भी कर सकते हैं, लेकिन फिर आपको डुप्लिकेट करने की आवश्यकता है case में बयान where तथा order by क्वेरी के कुछ हिस्सों:

select top 1
stu_id
,type
,address
,eff_date
,case when expr_date = "1/1/1900" then "12/31/2100" else expr_date end as expr_date
from   #temp
where  stu_id = 1
and  type = "primary"
and  getdate() between eff_date and case when expr_date = "1/1/1900" then "12/31/2100" else expr_date end
order by case when expr_date = "1/1/1900" then "12/31/2100" else expr_date end desc
,eff_date desc

इस तरह के एक छोटे डेटासेट के साथ, showplan यह नहीं बताता कि कौन सी क्वेरी सबसे कुशल होगी; यह पहले को छोड़कर, दोनों प्रश्नों के लिए समान समान क्वेरी योजना दिखाती है select बयान ने योजना को संकलित करने के लिए 7 सीपीयू चक्र लिया और दूसरा select बयान ने योजना को संकलित करने के लिए 2 सीपीयू चक्र लिया। आप इंडेक्स आदि के साथ वास्तविक तालिकाओं पर एक बड़े डेटासेट के खिलाफ परीक्षण करना चाह सकते हैं, और देखें कि कौन सा सर्वश्रेष्ठ प्रदर्शन करता है।


संबंधित सवाल
सबसे लोकप्रिय