查询以查找Mysql中连续行之间的差异

查询以查找Mysql中连续行之间的差异,mysql,database-table,Mysql,Database Table,由于我是MySQL新手,这个问题可能很愚蠢。如何找到连续行之间的差异? 示例: 表(tableName='Abc')包含一行,如下所示: |DATA| |10 | |20 | |30 | |40 | |50 | 这里我想得到输出,如下所示 |Dif| |10 | |10 | |10 | |10 | 如何在没有任何索引(主索引或自动增量)的情况下找到这样的差异?最好在DB之外跟踪前一行。下面是一些代码(希望我的php不会太生疏): 如果出于某种原因需要在db中执行此操作,那么最好

由于我是MySQL新手,这个问题可能很愚蠢。如何找到连续行之间的差异?
示例:
表(tableName='Abc')包含一行,如下所示:

|DATA|
|10  |
|20  |
|30  |
|40  |
|50  |
这里我想得到输出,如下所示

|Dif|
|10 |
|10 |
|10 |
|10 |

如何在没有任何索引(主索引或自动增量)的情况下找到这样的差异?

最好在DB之外跟踪前一行。下面是一些代码(希望我的php不会太生疏):


如果出于某种原因需要在db中执行此操作,那么最好创建一个存储过程,该存储过程基本上执行相同的操作:实例化一个值为0的变量,报告每行与该变量的差异,然后将该变量设置为行值


如John Pick所述,编辑以添加order by子句自联接是比较连续行的一种方法:

SELECT
    MIN(T2.DATA - T1.DATA) AS Dif
FROM
    Abc T1 INNER JOIN Abc T2 on T1.DATA < T2.DATA
ORDER BY
    T1.DATA
选择
最小值(T2.DATA-T1.DATA)作为Dif
从…起
Abc T1内部连接Abc T2在T1上。数据
使用用户定义的变量:

SET @prevValue:=0;
SELECT value-@prevValue AS diff,@prevValue:=value FROM t;
您必须为您的案例放弃第一行

如果表中同时包含
value
diff
字段,则可以使用以下选项设置
diff
字段:

SET @prevValue:=0;
UPDATE t SET diff=IF((@d:=value-@prevValue) AND (@prevValue:=value),@d,@d);

使用
IF
是设置
diff
和更新
@prevValue
变量的唯一方法。

这是一列,而不是一行,并且它的顺序是一致的。除非您在SQL语句中使用ORDER BY子句,否则MySQL可以以任何顺序返回数据。
对T1.data
不会导致下面的所有行生成x*y行吗?我的意思是它不会加入50和10,50和20,。。etc?@prajeeshkumar如果不是用于
MIN()
,则连接将是三角形的
(x*x+x)/2,这将确保行与1:1匹配,但最后一行不匹配。结果是
x-1
行。这似乎只适用于单调递增的数据集,不是吗?我错过什么了吗?当我运行它时,我会得到一个单例(当值之间没有差异时)或错误的时间差分(当数据集是非单调的时)。使用group by而不是order by可以得到我正在寻找的结果
SET @prevValue:=0;
UPDATE t SET diff=IF((@d:=value-@prevValue) AND (@prevValue:=value),@d,@d);