GROUP BY with MAX(DATE) in table with composite primary key

GROUP BY with MAX(DATE) in table with composite primary key

我试图在 table 中列出每个 SKU 的条码,但条码在某些情况下是不同的,所以我想从一个 sku 获得一个条码,返回的条码应该是那个UpdateDate 最近。

示例:

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

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

可能会像

一样使用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

试试这个,

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;

嗯,答案不是很明显吗? SKU 只是密钥的一部分,所以不要在没有另一部分 StoreID 的情况下使用 SKU

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;

另一种方法是对行进行排名,这样您就不必访问 table 两次:

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;

您可以使用外部应用:

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