GRUPPE BY mit MAX (DATE) in Tabelle mit zusammengesetztem Primärschlüssel

Ich versuche, den BarCode für jede SKU in einer Tabelle aufzulisten, aber der BarCode ist in einigen Fällen anders, also möchte ich von einem Sku einen Barcode bekommen und der Barcode, der zurückgegeben wird, sollte der mit dem UpdateDate sein.

Beispiel:

StoreID SKU BarCode UpdateDate ------------------------------------------------------------- 1 95810 28471000000 10/06/2016 04:20:00 am 1 95810 30040050033 01/03/2012 01:00:00 am 2 44320 65453102001 15/05/2010 01:00:00 am 2 44320 12343102001 01/01/2015 01:00:00 am 

Das gewünschte Ergebnis sollte sein:

 StoreID SKU BarCode UpdateDate ------------------------------------------------------------- 1 95810 28471000000 10/06/2016 04:20:00 am 2 44320 12343102001 01/01/2015 01:00:00 am 

Ich habe versucht zu verwenden

 SELECT t.SKU, r.MaxTime FROM (SELECT P.SKU, MAX(P.Fec_Movto) as MaxTime FROM Productos as P GROUP BY P.SKU) r INNER JOIN Productos t ON t.SKU = r.SKU AND t.Fec_Movto = r.MaxTime 

aber das Problem hier ist, dass Primärschlüssel ist ein zusammengesetzter Primärschlüssel, so dass es überhaupt nicht funktioniert.

   

kann wie folgt verwendet werden

 select * from ( select StoreID,SKU,BarCode,UpdateDate ,row_number() over ( partition by SKU order by UpdateDate desc) rowid from Productos ) t where rowid = 1 

Nun, ist die Antwort nicht offensichtlich? SKU ist nur ein Teil des Schlüssels, also keine SKU ohne den anderen Teil StoreID .

 SELECT p.StoreId, p.SKU, p.Barcode, p.Fec_Movto FROM Productos p JOIN ( SELECT StoreId, SKU, MAX(Fec_Movto) as MaxTime FROM Productos GROUP BY StoreId, SKU ) r ON p.StoreId = r.StoreId AND p.SKU = r.SKU AND p.Fec_Movto = r.MaxTime; 

Eine Alternative wäre, die Zeilen zu ordnen, also musst du nicht zweimal auf den Tisch zugreifen:

 SELECT StoreId, SKU, Barcode, Fec_Movto FROM ( SELECT SKU, Fec_Movto, ROW_NUMBER() OVER (PARTITION BY StoreId, SKU ORDER BY Fec_Movto DESC) AS rn FROM Productos ) ranked WHERE rn = 1; 

Sie können OUTER APPLY verwenden:

 SELECT distinct main.StoreId, main.SKU, b.Barcode, b.UpdateDate FROM Productos as main Outer Apply (Select Top 1 SKU, BarCode, UpdateDate from Productos as sub where main.SKU = sub.SKU Order by sub.UpdateDate desc ) b 

Versuche dies,

 SELECT p.StoreId, p.SKU, p.Barcode, p.UpdateDate FROM AProductos p JOIN( SELECT StoreId, SKU, MAX(UpdateDate) as MaxTime FROM AProductos GROUP BY StoreId, SKU ) r ON p.StoreId = r.StoreId AND p.SKU = r.SKU AND p.UpdateDate = r.MaxTime;