有关更新列的SQL Server查询

时间:2012-05-05 09:06:46

标签: sql-server-2008

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

我要找的是更新专栏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

1 个答案:

答案 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(

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

  • 如果存在“已移位”行,则ItemValue值的差异将返回为ItemActual - 否则将返回主行中的ItemValue

我希望这能解决你的问题