2009-07-30 14 views
1

J'ai une table qui enregistre les mises à jour de l'inventaire tout au long de la journée.Obtenir le dernier enregistrement pour chaque date d'une table

Tableau InventoryHistory:

UpdateID INT IDENTITY 
ProductID INT 
UpdateDateTime DATETIME 
QuantityOnHand INT 

records exemples:

1, 1, '7/29/2009 9:00', 100 
2, 1, '7/29/2009 14:00', 99 
3, 1, '7/29/2009 20:00', 98 
4, 1, '7/30/2009 9:00', 97 

Pour un ProductID donné, je dois obtenir une ligne renvoyée pour chaque jour pendant les 30 derniers jours qui a la dernière mise à jour avant 17h pour ce jour donné.

Ainsi, les résultats pour ProductID = 1 doivent être:

2, 1, '7/29/2009 14:00', 99 
4, 1, '7/30/2009 9:00', 97 

J'ai essayé la construction d'une table temporaire avec les 30 derniers jours, puis une sous-requête contre, mais que je suis courir en cercles pendant des heures, et j'essaie de trouver une solution élégante (sans utiliser les curseurs).

Aide!

Répondre

3

d'essayer un comment CTE avec un numéro de ligne partitionné (SQL 2005 & plus récente) ...

WITH MyCte AS (SELECT *, 
         RowNum = ROW_NUMBER() OVER (PARTITION BY CONVERT(CHAR(8), UpdateDateTime, 112) ORDER BY UpdateDateTime DESC) 
       FROM InventoryHistory 
       WHERE UpdateDateTime >= convert(char(8), dateadd(yy, -30, getdate()), 112) 
         AND DATEPART(hh, UpdateDateTime) < 17) 
SELECT UpdateID, 
     ProductID, 
     UpdateDateTime, 
     QuantityOnHand 
FROM  MyCte 
WHERE RowNum = 1 


/* Results 
UpdateID ProductID UpdateDateTime   QuantityOnHand 
----------- ----------- ----------------------- -------------- 
2   1   2009-07-29 14:00:00.000 99 
4   1   2009-07-30 09:00:00.000 97 

(2 row(s) affected) 
*/ 
+0

fonctionne très bien, à condition que l'OP est sur SQL Server 2005 et jusqu'à - ne fonctionnera pas dans SQL Server 2000 :-( –

+0

sûr - mais compte tenu de l'ancienneté de SQL 2000, il faut préciser qu'ils sont en cours d'exécution sur une ancienne version en posant une question;) –

+0

Cela a fonctionné parfaitement! (Et je suis sur SQL 2008, c'est pourquoi je n'ai pas pris la peine de le mentionner). Merci beaucoup pour votre aide! – khutch

Questions connexes