由于我是 MySQL 新手,这个问题可能很愚蠢。如何找到连续行之间的差异?
示例:
一个表 (tableName='Abc') 包含如下一行,
|DATA|
|10 |
|20 |
|30 |
|40 |
|50 |
在这里我想得到输出,
|Dif|
|10 |
|10 |
|10 |
|10 |
如何在没有任何索引(主要或 Auto_increment)的情况下找到这样的差异?
由于我是 MySQL 新手,这个问题可能很愚蠢。如何找到连续行之间的差异?
示例:
一个表 (tableName='Abc') 包含如下一行,
|DATA|
|10 |
|20 |
|30 |
|40 |
|50 |
在这里我想得到输出,
|Dif|
|10 |
|10 |
|10 |
|10 |
如何在没有任何索引(主要或 Auto_increment)的情况下找到这样的差异?
自联接是比较连续行的一种方法:
SELECT
MIN(T2.DATA - T1.DATA) AS Dif
FROM
Abc T1 INNER JOIN Abc T2 on T1.DATA < T2.DATA
ORDER BY
T1.DATA
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.
最好通过跟踪前一行在数据库之外执行此操作。这是一些代码(希望我的 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 子句