所以我想知道是否有更有效的方法来做同样的事情,如下所示。基本上对于给定的货物,我需要找到相同产品的最新货物。在小数据上,这不是一个大问题,但在一百多万行上,它变成了令人难以置信的时间。
Create table #test(
ID int,
Product varchar(50),
DeliveryDate datetime
)
Insert into #test values
(1,'Apples','1/1/17'),
(2,'Oranges','1/1/17'),
(3,'Apples','2/1/17'),
(4,'Grapes','2/1/17'),
(5,'Apples','3/1/17'),
(6,'Grapes','3/1/17'),
(7,'Apples','4/1/17'),
(8,'Apples','5/1/17')
Select top 100 * From #test
SELECT
T.Id,
T.Product,
T.DeliveryDate,
(select max(S.DeliveryDate)
from #test S
where s.Product = T.Product
and S.DeliveryDate < T.DeliveryDate
) AS PriorPurchase
FROM #Test T
答案 0 :(得分:1)
您可以使用窗口功能。 LAG()
似乎最合适:
SELECT T.*,
LAG(T.DeliveryDate) OVER (PARTITION BY T.Product
ORDER BY T.DeliveryDate
) as PriorPurchase
FROM #Test T;
请注意,这并不完全相同。如果给定产品的多个行具有相同的交货日期(样本数据中不会出现这种情况),则LAG()
不完全相同。如果你确实有这样的数据,那么仍然可以使用窗口函数,但逻辑有点棘手。