最近发货的SQL

时间:2017-11-05 13:47:39

标签: sql sql-server tsql

所以我想知道是否有更有效的方法来做同样的事情,如下所示。基本上对于给定的货物,我需要找到相同产品的最新货物。在小数据上,这不是一个大问题,但在一百多万行上,它变成了令人难以置信的时间。

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

1 个答案:

答案 0 :(得分:1)

您可以使用窗口功能。 LAG()似乎最合适:

SELECT T.*,
       LAG(T.DeliveryDate) OVER (PARTITION BY T.Product
                                 ORDER BY T.DeliveryDate
                                ) as PriorPurchase
FROM #Test T;

请注意,这并不完全相同。如果给定产品的多个行具有相同的交货日期(样本数据中不会出现这种情况),则LAG()不完全相同。如果你确实有这样的数据,那么仍然可以使用窗口函数,但逻辑有点棘手。