sql-server - 如何减去sql中的前一行?

标签 sql-server vb6

如果我想将当前行减去上一行,我应该查询什么?我将在 vb6 中循环使用它。 像这样的东西:

Row
1
2
3
4
5

在第一个循环中,值 1 不会被扣除,因为它没有前一行,这是可以的。 下一个循环的值 2 将减去上一行的值 1。依此类推,直到最后一行。

我怎样才能实现这个例程? 通过 SQL 查询或 VB6 代码。任何都可以。

最佳答案

假设您有一个排序列(例如 id),那么您可以在 SQL Server 2012 中执行以下操作:

select col,
       col - coalesce(lag(col) over (order by id), 0) as diff
from t;

在 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

这里使用 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;

所有这些都假设您有一些用于指定排序的列。它可能是一个id,或者一个创建日期或其他东西。 SQL 表本质上是无序的,因此不存在没有指定顺序的列的“前一行”。

关于sql-server - 如何减去sql中的前一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17560829/

相关文章:

sql-server - TDE 启用对数据库性能有何影响?

collections - 在 VB6 中创建自定义类的匿名实例

vba - 有什么方法可以在 vb 或 vba 中对齐消息框中的文本吗?

vba - 为什么这段代码在粘贴时会编译,否则会失败?

sql - 是否可以拒绝访问内置 sql 函数,例如 CONNECTIONPROPERTY 和 CURRENT_USER

asp.net - 尝试使用未为此报表服务器注册或不受此版本支持的数据扩展

vb6 - 在VB6中,当引用.NET组件时,为什么必须引用.TLB文件?

vb6 - 如何从 VB6 使用 TFS 2010

sql-server - 一行查询中的多行

sql - 如何确保非负列?