2016-11-15 2 views
1

Ich versuche, eine Reihe von IDs, die bestimmten Kriterien entsprechen, zu wählen, und ich habe Schwierigkeiten, die SQL-Abfrage schreiben, die zurückgeben, was ich will.SQL wählen Sie max IDs aus zwei Tabellen für eine Gruppe

Tabelle 1:

SelloutPriceID|SiteID|CountryCode|CurrencyCode|RequestID|RequestDateTime|InsertedDateTime 
666|1002|BE|EUR|12504|2016-09-02 11:57:12.0000000|2016-11-14 14:27:35.980 
667|1002|BE|EUR|12501|2016-09-02 11:57:12.0000000|2016-11-14 14:27:36.600 
668|1002|BE|EUR|12507|2016-09-02 11:57:12.0000000|2016-11-14 14:27:36.963 

Tabelle 2:

SelloutPricesAuditID|RequestID|SiteID|CountryCode|InsertedDateTime 
1|128|1002|BE|2016-11-14 16:55:29.543 
2|12507|1002|BE|2016-11-14 17:07:16.633 

ich zu einer Gruppe von SITEID und auf beiden Tabellen Ländercode versuche dann erhalten nur die max Anforderungs-ID für diese Gruppe. Fügen Sie dann die Tabellen zusammen, die auf der Site-ID, dem Ländercode und der maximalen Anforderungs-ID übereinstimmen.

Wenn die linke Tabellenzeile nicht in der rechten Tabelle ist, möchte ich sie zurückgeben. Wenn die Anfrage-ID der rechten Tabelle nicht gleich der MaxRequestID der linken Tabelle ist, möchte ich diese Zeile zurückgeben.

Dies ist, was ich bisher:

SELECT s.*, spa2.* 
FROM [SPS_selloutprices].[SelloutPrices] as s WITH (NOLOCK) 

inner join (select sp.SiteID, sp.CountryCode, Max(sp.RequestID) as maxrequestid 
      from SPS_selloutprices.SelloutPrices sp 
      group by sp.SiteID, sp.CountryCode 
      ) s2 
      on s2.SiteID = s.SiteID and s.CountryCode = s2.CountryCode and s2.maxrequestid = s.RequestID 

full join (select spa.SiteID, spa.CountryCode, MAX(spa.RequestID) as maxrequestid 
      from sps_pricealerts.SelloutPricesAudit spa 
      group by spa.SiteID, spa.CountryCode 
      ) spa2 
      on s.SiteID = spa2.SiteID and s.CountryCode = spa2.CountryCode and s2.maxrequestid = spa2.maxrequestid 

Antwort

0

Dies ist die Antwort, die ich mit am Ende kam und es funktioniert, wie ich es möchte, wenn Sie Möglichkeiten haben, es zu verbessern Ich mag würde zu höre deine Vorschläge.

SELECT s.*, spa2.* 
FROM [SPS_selloutprices].[SelloutPrices] as s WITH (NOLOCK) 

inner join (select sp.SiteID, sp.CountryCode, Max(cast(sp.RequestID as int)) as maxrequestid 
      from SPS_selloutprices.SelloutPrices sp 
      group by sp.SiteID, sp.CountryCode 
      ) s2 
      on s2.SiteID = s.SiteID and s.CountryCode = s2.CountryCode and s2.maxrequestid = s.RequestID 

full join (select spa.SiteID, spa.CountryCode, spa.IsRetrieved, max(cast(spa.RequestID as int)) as maxrequestid 
      from sps_pricealerts.SelloutPricesAudit spa 
      group by spa.SiteID, spa.CountryCode, spa.IsRetrieved 
      ) spa2 
      on s.SiteID = spa2.SiteID and s.CountryCode = spa2.CountryCode and s2.maxrequestid = spa2.maxrequestid 
where ((s.RequestID <> spa2.maxrequestid or spa2.maxrequestid is null) 
or (spa2.IsRetrieved <> 1 or spa2.IsRetrieved is null)) 
and s.CountryCode = @countryCode 
+0

denken, wenn Ihre vollständigen Rückkehr nur die rechte Hand Datensatz beitreten, dann s2.maxrequestid NULL ist - so auch diese Zeile nicht INNER JOIN zurück und verschwindet - wenn das ein Problem ist - möchten Sie vielleicht überprüfen – Cato

0

zu versuchen, die FULL OUTER JOIN in Gebrauch zu reflektieren - wurde von

 SELECT s.*, spa2.* 
    FROM [SPS_selloutprices].[SelloutPrices] as s 

    inner join (select sp.SiteID, sp.CountryCode, Max(sp.RequestID) as maxrequestid 
       from SPS_selloutprices.SelloutPrices sp 
       group by sp.SiteID, sp.CountryCode 
       ) s2 
       on s2.SiteID = s.SiteID and s.CountryCode = s2.CountryCode and s2.maxrequestid = s.RequestID 
        OR spa2.SiteID = s.SiteID and s.CountryCode = spa2.CountryCode and spa2.maxrequestid = s.RequestID 

    full join (select spa.SiteID, spa.CountryCode, MAX(spa.RequestID) as maxrequestid 
       from sps_pricealerts.SelloutPricesAudit spa 
       group by spa.SiteID, spa.CountryCode 
       ) spa2 
       on s.SiteID = spa2.SiteID and s.CountryCode = spa2.CountryCode and s2.maxrequestid = spa2.maxrequestid 
Verwandte Themen