Dernier envoi SQL

Je me request donc s'il existe un moyen plus efficace de faire la même chose que ce qui se passe ci-dessous. Essentiellement pour un envoi donné, je dois find l'expédition la plus récente du même produit. Sur de petites données, ce n'est pas un gros problème, mais sur un million de lignes et plus, cela devient un time incroyable.

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 

Vous pouvez utiliser les fonctions de la window. LAG() semble le plus approprié:

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

Notez que ce n'est pas exactement la même chose. Si vous avez plusieurs lignes avec la même date de livraison pour un produit donné (cela ne se produit pas dans les exemples de données), alors LAG() n'est pas tout à fait le même. Si vous avez de teldatatables, les fonctions de window peuvent toujours être utilisées, mais la logique est un peu plus compliquée.