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

Dee*_*ani 8 mysql database-table

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

|DATA|
|10  |
|20  |
|30  |
|40  |
|50  |
Run Code Online (Sandbox Code Playgroud)

在这里,我想得到输出,

|Dif|
|10 |
|10 |
|10 |
|10 |
Run Code Online (Sandbox Code Playgroud)

如何在没有任何索引(primary或​​Auto_increment)的情况下找到这样的差异?

Joh*_*ick 9

自联接是比较连续行的一种方法:

SELECT
    MIN(T2.DATA - T1.DATA) AS Dif
FROM
    Abc T1 INNER JOIN Abc T2 on T1.DATA < T2.DATA
ORDER BY
    T1.DATA
Run Code Online (Sandbox Code Playgroud)

  • 这似乎仅适用于单调增加的数据集,不是吗?我错过了什么?当我运行它时,我得到一个单例(当值之间没有差异时)或不正确的时间差异(当数据集是非单调的时). (2认同)

Rog*_*eck 7

使用用户定义的变量:

SET @prevValue:=0;
SELECT value-@prevValue AS diff,@prevValue:=value FROM t;
Run Code Online (Sandbox Code Playgroud)

你必须丢弃你案件的第一行.

如果表中同时包含valuediff字段,可以设置diff字段:

SET @prevValue:=0;
UPDATE t SET diff=IF((@d:=value-@prevValue) AND (@prevValue:=value),@d,@d);
Run Code Online (Sandbox Code Playgroud)

使用IF是我能找到的唯一途径设定diff 更新@prevValue变量.


Ili*_*ion 4

最好通过跟踪前一行来在数据库外部执行此操作。这是一些代码(希望我的 php 不是太生疏):

<?php

$prevNum = 0;

$db = mysql_connect(...); // fill in connection string

mysql_select_db("my_db", $db);

$result = mysql_query("select DATA from Abc order by DATA");

while ($row = mysql_fetch_array($result)) {

    $diff = $row[0] - $prevNum;

    echo "$diff\n";

    $prevNum = $row[0];

}

?>
Run Code Online (Sandbox Code Playgroud)

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

编辑以添加 John Pick 指出的 order by 子句