1

我之前也问过一个类似的问题,但发布一个新问题,因为我不想混淆其他成员,并且还有一个额外的专栏。

我正在寻找的是更新列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
4

1 回答 1

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将获得 1 的 RX(行索引)

  • 然后它将 CTE 与自身连接起来,移动一个 RX - 所以我将 RX = 1 与 RX = 2(如果存在)等进行比较。

  • 如果存在“移位”行,ItemValue则返回值的差异ItemActual- 否则返回ItemValue来自主行的

我希望这能解决你的问题

于 2012-05-05T09:49:31.440 回答