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

Posted

技术标签:

【中文标题】SQL查找上一行和当前行之间的差异【英文标题】:SQL Find difference between previous and current row 【发布时间】: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'子句。 【参考方案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

以上是关于SQL查找上一行和当前行之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

SQL:StartTime 列的当前行与 EndTime 列的上一行之间的差异

查找当前版本和上一个版本之间的差异

在 MS Access 或 SQL Server 中查找 2 个表之间的差异

查找时间和当前时间之间的差异

在grafana中查找当前时间和上次失败之间的差异?

查找行之间的绝对差异并将差异与其他行进行比较