由于我是MySQL的新手,这个问题可能很愚蠢。如何找到连续行之间的差异?
例如:
表(tableName ='Abc')包含单行,如下所示,
|DATA|
|10 |
|20 |
|30 |
|40 |
|50 |
这里我希望得到输出,
|Dif|
|10 |
|10 |
|10 |
|10 |
如何在没有任何索引(主要或自动增量)的情况下找到这样的差异?
答案 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;
你必须丢弃你案件的第一行。
如果该表包含value
和diff
字段,您可以将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子句