1

以前にも同様の質問をしましたが、他のメンバーを混乱させたくないので、新しい質問を投稿します。追加の列があります。

私が探しているのは、列を更新することItemActualです。これは、同じものがある場合ItemValueは、最新のものとの違いで更新する必要があります。CurrentTimeStartTime

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 (Common Table Expression) を作成し、データを「分割」してName,StartTimeこれらの行を並べ替えます。したがってCurrentTime DESC、各グループの最新のエントリName,StartTimeは RX (行インデックス) が 1 になります。

  • 次に、その CTE を自分自身に対して結合し、RX を 1 つシフトします。つまり、RX = 1 と RX = 2 (存在する場合) などを比較しています。

  • 「シフトされた」行が存在する場合、ItemValue値の差は次のように返されItemActualます。それ以外の場合はItemValue、メイン行からが返されます。

これで問題が解決することを願っています

于 2012-05-05T09:49:31.440 に答える