【问题标题】:SQL Find difference between previous and current rowSQL查找上一行和当前行之间的差异
【发布时间】:2014-04-21 15:17:08
【问题描述】:

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

无法绑定多部分标识符“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

【问题讨论】:

  • 您使用的是哪个数据库?
  • 你必须按列名进行分区。
  • 可以省略'partition by'子句。

标签: sql sql-server


【解决方案1】:

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

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

注意:LAG的第三个可选参数为:

默认

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

【讨论】:

  • 不错的解决方案,但它为第一行给出了错误的结果,1 而不是 null。
  • 啊,对,我没有仔细阅读所需的示例输出。如果我们省略 LAG 中默认为 0 的第三个参数,它将在第一行给出一个空值。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我认为您不需要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;
    

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

    【讨论】:

    • 我试过这个查询,但它在第二列中返回 NULLS。有什么建议吗?
    • @user3356901 。 . .它返回了NULLs,因为我在你的情况下离开了a.columnOfNumbers = b.columnOfNumbers
    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多