SQL查找上一行和当前行之间的差异

SQL查找上一行和当前行之间的差异,sql,sql-server,Sql,Sql Server,我试图找出当前行和前一行之间的差异。但是,我收到以下错误消息: 无法绑定多部分标识符“tableName” 不确定如何修复错误 谢谢 输出应如下所示: columnOfNumbers Difference 1 NULL 2 1 3 1 10 7 12 2 ....

我试图找出当前行和前一行之间的差异。但是,我收到以下错误消息:

无法绑定多部分标识符“tableName”

不确定如何修复错误

谢谢

输出应如下所示:

columnOfNumbers     Difference
      1               NULL
      2               1
      3               1
      10              7
      12              2
      ....            ....
代码:


我认为您不需要
分区by
语句:

WITH CTE AS (
      SELECT ROW_NUMBER() OVER (ORDER BY columnOfNumbers) as ROW,
             columnOfNumbers
      FROM tableName
     )
SELECT a.columnOfNumbers, a.columnOfNumbers - b.columnOfNumbers
FROM CTE a LEFT JOIN
     CTE b
     ON a.ROW = b.ROW + 1;
如果确实需要,则应输入列名而不是表名。

请参阅


如果您在SQL Server 2012+中使用LAG,则可以使用LAG

 SELECT columnOfNumbers
       ,columnOfNumbers - LAG(columnOfNumbers, 1) OVER (ORDER BY columnOfNumbers)
   FROM tableName
注:LAG的可选第三个参数为:

违约

偏移量处的标量_表达式为NULL时返回的值。 如果未指定默认值,则返回NULL。默认值可以是 列、子查询或其他表达式,但不能是分析表达式 功能。默认值必须与标量表达式的类型兼容


您使用的是哪个数据库?您必须按列名进行分区。您可以省略“partition by”子句。我尝试了此查询,但它在第二列中返回null。有什么建议吗?@user3356901。它返回了
NULL
s,因为我离开了您的状态
a.columnOfNumbers=b.columnOfNumbers
。这是一个不错的解决方案,但第一行的结果是错误的,1而不是NULL。啊,对了,我没有仔细阅读所需的示例输出。如果我们在LAG中省略默认为0的第三个参数,它将在第一行中给出null int。
;WITH tblDifference AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY id) AS RowNumber, columnOfNumbers 
    FROM tableName
)

SELECT cur.columnOfNumbers, cur.columnOfNumbers - previous.columnOfNumbers
FROM tblDifference cur
LEFT OUTER JOIN tblDifference previous
ON cur.RowNumber = previous.RowNumber + 1
 SELECT columnOfNumbers
       ,columnOfNumbers - LAG(columnOfNumbers, 1) OVER (ORDER BY columnOfNumbers)
   FROM tableName