我之前曾问过一个类似的问题,但发布一个新问题,因为我不想混淆其他问题 成员,还有一栏。
我要找的是更新专栏ItemActual
。对于同一ItemValue
(如果有),最新CurrentTime
的{{1}}与StartTime
之间的差异需要更新。
如果除当前行之外的同一StartTime
没有其他条目,则它必须是ItemValue
本身。仅对具有相同名称的项目进行比较。
例如,Rownum 283,ItemActual = 347013
(因为没有其他行具有相同的StartTime
)。
这也适用于行235,即ItemActual = 1086054.00
对于第190行,这需要664031.00 - 533023.00 (comparing with row 145) = 131008
但是对于第10行,这将是532023.00
,因为之前没有相同项目使用相同的StartTime
。
Rownum Name ItemValue CurrentTime StartTime
283 ABC 347013.00 3/05/2012 16:01 29/04/2012 6:29
235 ABC 1086054.00 26/03/2012 14:05 7/03/2012 21:18
190 ABC 664031.00 13/02/2012 13:42 29/01/2012 6:39
145 ABC 533023.00 7/02/2012 14:01 29/01/2012 6:39
100 ABC 532023.00 7/02/2012 13:33 29/01/2012 6:39
55 ABC 532023.00 7/02/2012 12:52 29/01/2012 6:39
10 ABC 532023.00 7/02/2012 12:51 29/01/2012 6:39
310 DEF 351012.00 3/05/2012 16:01 29/04/2012 6:29
261 DEF 1339066.00 26/03/2012 14:05 7/03/2012 21:18
215 DEF 785034.00 13/02/2012 13:42 29/01/2012 6:39
170 DEF 620026.00 7/02/2012 14:01 29/01/2012 6:39
答案 0 :(得分:0)
您可以尝试这样的事情:
;WITH PartData AS
(
SELECT
RowNum, Name, ItemValue, CurrentTime, StartTime,
RX = ROW_NUMBER() OVER(PARTITION BY Name,StartTime ORDER BY CurrentTime DESC)
FROM dbo.YourTable
)
SELECT
p1.RowNum, p1.ItemValue, p1.CurrentTime, p1.StartTime,
RowNumComparedTo = p2.RowNum,
ItemActual = CASE
WHEN p2.RX IS NULL THEN p1.ItemValue
ELSE p1.ItemValue - p2.ItemValue
END
FROM PartData p1
LEFT OUTER JOIN PartData p2 ON p1.StartTime = p2.StartTime
AND p1.Name = p2.Name
AND p2.RX = p1.RX + 1
我得到这样的输出:
RowNum ItemValue CurrentTime StartTime RowNumComparedTo ItemActual
190 664031.00 2012-02-13 13:42 2012-01-29 06:39 145 131008.00
145 533023.00 2012-02-07 14:01 2012-01-29 06:39 100 1000.00
100 532023.00 2012-02-07 13:33 2012-01-29 06:39 55 0.00
55 532023.00 2012-02-07 12:52 2012-01-29 06:39 10 0.00
10 532023.00 2012-02-07 12:51 2012-01-29 06:39 NULL 532023.00
215 785034.00 2012-02-13 13:42 2012-01-29 06:39 170 165008.00
170 620026.00 2012-02-07 14:01 2012-01-29 06:39 NULL 620026.00
235 1086054.00 2012-05-03 14:05 2012-03-07 21:18 NULL 1086054.00
261 1339066.00 2012-03-26 14:05 2012-03-07 21:18 NULL 1339066.00
283 347013.00 2012-05-03 16:01 2012-04-29 06:29 NULL 347013.00
310 351012.00 2012-05-03 16:01 2012-04-29 06:29 NULL 351012.00
解决方案基本上是这样做的:
它会创建一个CTE(公用表格表达式)并按Name,StartTime
对您的数据进行“分区”,并按CurrentTime DESC
对这些行进行排序 - 因此每个Name,StartTime
的最新条目group将获得1(
然后将CTE与自身连接,移动一个RX - 所以我将RX = 1与RX = 2(如果存在)等进行比较。
如果存在“已移位”行,则ItemValue
值的差异将返回为ItemActual
- 否则将返回主行中的ItemValue
我希望这能解决你的问题