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

时间:2012-03-14 06:09:53

标签: mysql database-table

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

|DATA|
|10  |
|20  |
|30  |
|40  |
|50  |

这里我希望得到输出,

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:7)

使用用户定义的变量:

SET @prevValue:=0;
SELECT value-@prevValue AS diff,@prevValue:=value FROM t;

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

如果该表包含valuediff字段,您可以将diff字段设置为:

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

使用IF是我能找到的唯一方法 设置diff 更新@prevValue变量。< / p>

答案 2 :(得分:4)

最好通过跟踪上一行来在DB之外执行此操作。这里有一些代码(希望我的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];

}

?>

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

如John Pick所述,编辑添加order by子句