2009-07-30 133 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

相關問題