2012-05-05 65 views
1

我之前曾问过类似的问题,但发布了一个新的问题,因为我不想混淆其他 成员,并且还有一列。有关更新列的SQL Server查询

我在找什么是更新列ItemActual。这需要更新与ItemValue的差异,最新的CurrentTime对于相同的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

行145与行100相比,因为它具有相同的开始时间和相同的名称 – user1197981

回答

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(Common Table Expressi)上)和“分区”您通过Name,StartTime数据和CurrentTime DESC订购这些行 - 所以最近的1

  • 进入每个Name,StartTime集团将获得一个RX(行索引),那么它加入该CTE对本身,转移由一个RX - 所以我比较RX = 1到RX = 2(如果存在的话)等

  • 如果一个“移位”行是目前,在ItemValue值的差被返回作为ItemActual - 否则ItemValue从主排返回

我希望这能解决你的问题

+0

工作就像一种享受最新currrentTime ..太感谢你了:-) – user1197981

+0

@ user1197981:在这种情况下,在Stackoverflow上做的正确而有礼貌的事情是[接受答案](http://meta.stackexchange.com/q/5234/153998)来表达你的感激之情。 –

+1

抱歉,我不知道我必须这样做..现在做了 – user1197981