2009-07-30 96 views
1

我有一张记录全天清单更新的表格。从表中获取每个日期的最后记录

表InventoryHistory:

UpdateID INT IDENTITY 
ProductID INT 
UpdateDateTime DATETIME 
QuantityOnHand INT 

记录样本:

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 

对于给定的产品ID,我需要得到一个返回行的每一天过去30天,这之前就最后更新下午5点。

因此,对于产品ID的结果= 1应为:

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

我试图在它建立一个临时表与过去30天,然后针对该子查询,但我一直在圈子里跑了几个小时,我试图找到一个优雅的解决方案(不使用CURSORS)。

帮助!

回答

3

怎么想的CTE对分区行号(SQL 2005 &新)...

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

做工精细,提供的OP是SQL Server 2005上最多 - 不会在SQL Server中工作2000 :-( – 2009-07-30 21:31:00

相关问题