2014-04-21 79 views
7

我正在尝试查找当前行和前一行之间的差异。但是,我收到以下错误消息:SQL查找以前和当前行之间的差异

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

不知道如何解决这个错误。

谢谢!

输出应该如下所示:

columnOfNumbers  Difference 
     1    NULL 
     2    1 
     3    1 
     10    7 
     12    2 
     ....   .... 

代码:

USE DATABASE; 

WITH CTE AS 
(SELECT 
    ROW_NUMBER() OVER (PARTITION BY tableName ORDER BY columnOfNumbers) ROW, 
    columnOfNumbers 
    FROM tableName) 
SELECT 
    a.columnOfNumbers 
FROM 
    CTE a 
    LEFT JOIN CTE b 
    ON a.columnOfNumbers = b.columnOfNumbers AND a.ROW = b.ROW + 1 
+0

您正在使用哪个数据库? –

+1

您必须按列名进行分区。 –

+1

只能省略'partition by'子句。 –

回答

12

sqlFiddle

;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 
+0

谢谢,这个作品很棒! – ChaseHardin

1

我不认为你需要的partition 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; 

如果你确实需要它,你应该输入一个列名而不是表名。

+0

我试过这个查询,但它在第二列返回NULLS。有什么建议么? – ChaseHardin

+0

你一定在做错事,因为它适合我。 – wvdz

+0

@ user3356901。 。 。它返回了NULL值,因为我在你的条件中留下了'a.columnOfNumbers = b.columnOfNumbers'。 –

9

如果您在SQL Server 2012+可以使用LAG。

SELECT columnOfNumbers 
     ,columnOfNumbers - LAG(columnOfNumbers, 1) OVER (ORDER BY columnOfNumbers) 
    FROM tableName 

注:LAG的第三个可选参数是:

默认

返回时scalar_expression偏移量为NULL值。 如果未指定默认值,则返回NULL。默认可以是 的一列,子查询或其他表达式,但它不能是解析 函数。默认值必须与scalar_expression类型兼容。

+0

不错的解决方案,但它给第一行错误的结果,而不是null。 – wvdz

+2

啊,对,我没有仔细阅读所需的输出样本。如果我们忽略默认为0的LAG中的第三个参数,它将在第一行中给出一个null int。 –

相关问题