如何获取列字段两行之间的差值?

我有一张这样的桌子

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 所述)可能更有效。 我会试用不同的版本,并查看执行计划,看看哪一个版本在您所拥有的数据集规模上性能最佳...

评论(3)
SELECT rowInt, Value,
       COALESCE(
       (
       SELECT TOP 1 Value
       FROM myTable mi
       WHERE mi.rowInt > m.rowInt
       ORDER BY
             rowInt
       ), 0) - Value AS diff
FROM  myTable m
ORDER BY
      rowInt
评论(0)

如果您真的想确定订单,请使用 "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
评论(0)