8

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

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

在这里我想得到输出,

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

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

4

3 回答 3

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
于 2012-03-14T06:20:29.043 回答
7

Use user-defined variables:

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

You'll have to discard the first row for your case.

If the table contains both value and diff fields, you can set the diff field with:

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

Using the IF is the only way I could find to both set diff and update the @prevValue variable.

于 2013-08-09T18:12:06.643 回答
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];

}

?>

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

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

于 2012-03-14T06:17:53.020 回答