このようなテーブルがあります。
rowInt Value
2 23
3 45
17 10
9 0
....
rowInt列の値は整数ですが、同じ増分で連続していません。次のようなSQLを使用して、rowIntごとに値をリストアップできます。
SELECT * FROM myTable ORDER BY rowInt;
これはrowIntごとに値をリストアップします。次のような結果で、2つの行の値の差を得るにはどうすればよいでしょうか。
rowInt Value Diff
2 23 22 --45-23
3 45 -35 --10-45
9 0 -45 --0-45
17 10 10 -- 10-0
....
テーブルはSQL 2005 (Miscrosoft)
SELECT
[current].rowInt,
[current].Value,
ISNULL([next].Value, 0) - [current].Value
FROM
sourceTable AS [current]
LEFT JOIN
sourceTable AS [next]
ON [next].rowInt = (SELECT MIN(rowInt) FROM sourceTable WHERE rowInt > [current].rowInt)
EDIT: 考えてみると、(Quassnoi'の回答のように)selectでサブクエリを使用すると、より効率的かもしれません。 いろいろなバージョンを試してみて、実行プランを見て、あなたが持っているデータセットのサイズでどれが一番いいかを見てみたいと思います...。
どうしても注文を確認したい場合は、"Row_Number()"を使用して、現在のレコードの次のレコードを比較します("on"節をよく見てください)。
T1.ID + 1 = T2.ID
基本的には、"min"を指定したり、"top"を行わずに、次の行と現在の行を結合しています。 レコード数が少ない場合は、"Dems"や"Quassanoi"による他の解決策で問題ありません。
with T2 as (
select ID = ROW_NUMBER() over (order by rowInt),
rowInt, Value
from myTable
)
select T1.RowInt, T1.Value, Diff = IsNull(T2.Value, 0) - T1.Value
from ( SELECT ID = ROW_NUMBER() over (order by rowInt), *
FROM myTable ) T1
left join T2 on T1.ID + 1 = T2.ID
ORDER BY T1.ID