如果我想将当前行减去前一行,我应该查询什么.我将在vb6中使用它进行循环.像这样的东西:
Row
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
在第一个循环中,不会扣除值1,因为它没有前一行,这是可以的.接下来的循环值2将由前一行(值1)扣除.依此类推,直到最后一行.
我怎样才能实现这个程序?通过SQL查询或VB6代码.任何人都会这样做.
Gor*_*off 23
假设您有一个订购列 - 比如说id
- 那么您可以在SQL Server 2012中执行以下操作:
select col,
col - coalesce(lag(col) over (order by id), 0) as diff
from t;
Run Code Online (Sandbox Code Playgroud)
在早期版本的SQL Server中,您可以使用相关子查询执行几乎相同的操作:
select col,
col - isnull((select top 1 col
from t t2
where t2.id < t.id
order by id desc
), 0)
from t
Run Code Online (Sandbox Code Playgroud)
这使用isnull()
而不是coalesce()
因为SQL Server中的"错误"在使用时评估第一个参数两次coalesce()
.
您也可以这样做row_number()
:
with cte as (
select col, row_number() over (order by id) as seqnum
from t
)
select t.col, t.col - coalesce(tprev.col, 0) as diff
from cte t left outer join
cte tprev
on t.seqnum = tprev.seqnum + 1;
Run Code Online (Sandbox Code Playgroud)
所有这些都假设您有一些用于指定排序的列.它可能是一个id
,或创建日期或其他东西.SQL表本质上是无序的,所以没有"前一行"没有指定排序的列.