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
我试图在 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_numberselect * 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