2016-09-21 92 views
1

我想列出每个SKU在一个表中的条形码,但在某些情况下,条形码是不同的,所以我想从一个SKU一个条形码和返回的条形码应该是UpdateDate最新的条形码。GROUP BY与MAX(日期)在表中与复合主键

实施例:

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

期望的结果应该是:

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

我已经使用

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 

尝试,但这里的问题是,主键是一个复合主键所以它根本不起作用。

回答

3

可能使用ROW_NUMBER像

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

试试这个,

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; 
0

那么,是不是答案明摆着的吗? SKU只是关键的一部分,所以不要使用SKU而不使用其他部分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; 

另一种方法是排名的行,所以你不必访问两次表:

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; 
0

您可以使用OUTER APPLY:

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