次のように、SQL ステートメントを使用してフィールド [Allocation] の連続する値を比較しています。
;WITH cteMain AS
(SELECT AllocID, CaseNo, FeeEarner, Allocation, ROW_NUMBER() OVER (ORDER BY AllocID) AS sn
FROM tblAllocations)
SELECT m.AllocID, m.CaseNo, m.FeeEarner, m.Allocation,
ISNULL(sLag.Allocation, 0) AS prevAllocation,
(m.Allocation - ISNULL(sLag.Allocation, 0)) AS movement
FROM cteMain AS m
LEFT OUTER JOIN cteMain AS sLag
ON sLag.sn = m.sn-1;
クエリは、[Allocation] の連続した値の増加または減少である計算フィールド [movement] を返します。
このクエリによって返されるデータのスクリーン ショットを含めました。
ただし、クエリはまだ完了していません。比較される [Allocation] の連続する値が [FeeEarner] と [CaseNo] によってグループ化/分割されるように、ステートメントを修正する必要があります。
たとえば、データの 18 行目の [Allocation] は 800 で、前の値の 600 と比較されます。しかし、前の値は別の [CaseNo]、つまり 31 ではなく 6 に属します。実際には [FeeEarner] 'PJW ' [CaseNo] '31' には以前の [Allocation] がないため、[prevAllocation] は ISNULL キーワードから '0' である必要があります。
変えてみました
OVER (ORDER BY AllocID)
に
OVER (PARTITION BY CaseNo, FeeEarner ORDER BY AllocID)
しかし、その結果、多くのデータ行が繰り返されます。
[Allocation] の連続した値を比較する方法を誰かがアドバイスできますが、[FeeEarner] と [CaseNo] が一致するデータの行間のみを比較してください。
注- 私の顧客は並列データ ウェアハウスをサポートしていない SQL Server 2008 R2 を使用しているため、LAG を使用できません。