我有一张表全天记录库存更新。
表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
对于给定的ProductID,我需要在过去30天内每天返回一行,该行在当天的下午5点之前有最后一次更新。
因此,productid = 1的结果应为:
2, 1, '7/29/2009 14:00', 99
4, 1, '7/30/2009 9:00', 97
我已经尝试用最后30天构建一个临时表,然后是一个子查询,但是我已经在圈子里运行了几个小时,我正试图找到一个优雅的解决方案(不使用游标)。
帮助!
答案 0 :(得分:3)
如何尝试使用分区行号的CTE(SQL 2005& newer)......
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)
*/