我有一张这样的桌子
rowInt Value
2 23
3 45
17 10
9 0
....
rowInt 列的值是整数,但不是以相同增量顺序排列的。我可以使用下面的 sql 按 rowInt 列出值:
SELECT * FROM myTable ORDER BY rowInt;
这将按 rowInt 列出值。如何获取两行值的差值,结果如下:
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)
编辑:仔细想想,在 select 中使用子查询(如 Quassnoi'answer 所述)可能更有效。 我会试用不同的版本,并查看执行计划,看看哪一个版本在您所拥有的数据集规模上性能最佳...
如果您真的想确定订单,请使用 "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