मेरी एसक्यूएल थोड़ी जंग खा रही है, इसलिए मेरे साथ रहो।

मेरे पास एक प्रश्न है कि यूनियन दो अलग-अलग बयानों का चयन करते हैं जो विभिन्न स्रोतों से खींचते हैं। दो चुनिंदा बयानों का डेटा ओवरलैप होता है, लेकिन प्रत्येक एक तारीख कॉलम खींचता है जो स्रोत के आधार पर हमेशा पॉप्युलेट नहीं होता है।

मैं दिनांक कॉलम को अनदेखा करते हुए, दो कथनों के बीच डुप्लिकेट रिकॉर्ड को हटाने का एक तरीका खोजने का प्रयास कर रहा हूं।

जैसे कि, यदि दो या दो से अधिक रिकॉर्ड में एक ही PCName, विक्रेता, उत्पाद और संस्करण है, तो दिनांक कॉलम की परवाह किए बिना, रिकॉर्ड में से एक को फ़िल्टर किया जाता है।

SELECT DISTINCT 
   SYS.Netbios_Name0 as PCName,
   ARP.Publisher0 as Vendor,
   ARP.DisplayName0 as Product,
   ARP.Version0 as Version,
   replace(replace(convert(varchar,ARP.InstallDate0,120),'-',''),' 00:00:00','') as InstallDate,
   replace(replace(convert(varchar,ARP.InstallDate0,120),'-',''),' 00:00:00','') as InstallDate2
FROM v_Add_Remove_Programs ARP
JOIN v_R_System SYS 
  ON ARP.ResourceID=SYS.ResourceID
WHERE SYS.Netbios_Name0 like 'CH-%' and InstallDate0 NOT LIKE ''

UNION

Select DISTINCT 
    SYS.Netbios_Name0 as PCName,
    SP.CompanyName as Vendor, 
    SP.ProductName as Product, 
    SP.ProductVersion as Version,
    replace(replace(convert(varchar,MARP.InstallDate0,120),'-',''),' 00:00:00','') as InstallDate,
    replace(replace(convert(varchar,GSI.InstallDate0,120),'-',''),' 00:00:00','') as InstallDate2
FROM v_GS_SoftwareProduct SP
JOIN v_R_System SYS 
  ON SP.ResourceID=SYS.ResourceID

LEFT JOIN v_GS_Mapped_Add_Remove_Programs MARP
  ON SP.ResourceID = MARP.ResourceID
          AND RTRIM(LTRIM(UPPER(SP.ProductName))) 
                LIKE RTRIM(LTRIM(UPPER(MARP.DisplayName0)))
          AND RTRIM(LTRIM(UPPER(SP.ProductVersion))) 
                LIKE RTRIM(LTRIM(UPPER(MARP.Version0)))
LEFT JOIN v_GS_INSTALLED_SOFTWARE GSI
  ON SP.ResourceID = GSI.ResourceID
          AND RTRIM(LTRIM(UPPER(SP.ProductName))) 
                LIKE RTRIM(LTRIM(UPPER(GSI.ProductName0)))
          AND RTRIM(LTRIM(UPPER(SP.ProductVersion))) 
                LIKE RTRIM(LTRIM(UPPER(GSI.ProductVersion0)))

Where SYS.Netbios_Name0 Like 'CH-%' 
AND (MARP.InstallDate0 NOT LIKE ''
OR GSI.InstallDate0 NOT LIKE '')

ORDER By PCName, Vendor, Product, Version

Example duplicate

1
ssoong 29 मई 2018, 22:51

2 जवाब

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

संपूर्ण क्वेरी को रैप करें और फिर अपनी प्राथमिक कुंजी द्वारा विभाजन करें और केवल rownum=1 . को फ़िल्टर करें

select * from (
select *, row_number() over(partition by PCName, Vendor, Product, Version order by PCName, Vendor, Product, Version) rownum from (
SELECT   
   SYS.Netbios_Name0 as PCName,
   ARP.Publisher0 as Vendor,
   ARP.DisplayName0 as Product,
   ARP.Version0 as Version,
   replace(replace(convert(varchar,ARP.InstallDate0,120),'-',''),' 00:00:00','') as InstallDate,
   replace(replace(convert(varchar,ARP.InstallDate0,120),'-',''),' 00:00:00','') as InstallDate2
FROM v_Add_Remove_Programs ARP
JOIN v_R_System SYS 
  ON ARP.ResourceID=SYS.ResourceID
WHERE SYS.Netbios_Name0 like 'CH-%' and InstallDate0 NOT LIKE ''

UNION

Select  
    SYS.Netbios_Name0 as PCName,
    SP.CompanyName as Vendor, 
    SP.ProductName as Product, 
    SP.ProductVersion as Version,
    replace(replace(convert(varchar,MARP.InstallDate0,120),'-',''),' 00:00:00','') as InstallDate,
    replace(replace(convert(varchar,GSI.InstallDate0,120),'-',''),' 00:00:00','') as InstallDate2
FROM v_GS_SoftwareProduct SP
JOIN v_R_System SYS 
  ON SP.ResourceID=SYS.ResourceID

LEFT JOIN v_GS_Mapped_Add_Remove_Programs MARP
  ON SP.ResourceID = MARP.ResourceID
          AND RTRIM(LTRIM(UPPER(SP.ProductName))) 
                LIKE RTRIM(LTRIM(UPPER(MARP.DisplayName0)))
          AND RTRIM(LTRIM(UPPER(SP.ProductVersion))) 
                LIKE RTRIM(LTRIM(UPPER(MARP.Version0)))
LEFT JOIN v_GS_INSTALLED_SOFTWARE GSI
  ON SP.ResourceID = GSI.ResourceID
          AND RTRIM(LTRIM(UPPER(SP.ProductName))) 
                LIKE RTRIM(LTRIM(UPPER(GSI.ProductName0)))
          AND RTRIM(LTRIM(UPPER(SP.ProductVersion))) 
                LIKE RTRIM(LTRIM(UPPER(GSI.ProductVersion0)))

Where SYS.Netbios_Name0 Like 'CH-%' 
AND (MARP.InstallDate0 NOT LIKE ''
OR GSI.InstallDate0 NOT LIKE '')
)a)b
where rownum=1
1
Daniel Marcus 29 मई 2018, 22:54

एक पल के लिए UNION के बारे में भूल जाइए, कल्पना कीजिए कि आपके पास UNION परिणाम Table1 में डाला गया है, फिर केवल ROW_NUMBER() का उपयोग करके उस फ़ील्ड संयोजन की केवल पहली झलक चुनें जिसकी आपको आवश्यकता है।

SELECT *
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY PCName, Vendor, Product, Version
                                   ORDER BY InstallDate) as rn
      FROM Table1
     ) as T
WHERE rn = 1
0
Juan Carlos Oropeza 29 मई 2018, 23:00