由于我是MySQL的新手,这个问题可能很愚蠢。我怎样才能找到连续行之间的区别?
例子:
一个表(表名= 'ABC')包含一行如下,查询查找Mysql中连续行之间的差异
|DATA|
|10 |
|20 |
|30 |
|40 |
|50 |
在这里,我想获得输出,
|Dif|
|10 |
|10 |
|10 |
|10 |
如何找到喜欢的区别这没有任何索引(主或Auto_increment)?
由于我是MySQL的新手,这个问题可能很愚蠢。我怎样才能找到连续行之间的区别?
例子:
一个表(表名= 'ABC')包含一行如下,查询查找Mysql中连续行之间的差异
|DATA|
|10 |
|20 |
|30 |
|40 |
|50 |
在这里,我想获得输出,
|Dif|
|10 |
|10 |
|10 |
|10 |
如何找到喜欢的区别这没有任何索引(主或Auto_increment)?
通过跟踪上一行,最好在数据库之外进行此操作。下面是一些代码(希望我的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的变量,报告每行和该变量的差异,然后将该变量设置为行值。
编辑以by子句由约翰指出接
自联接添加订单是比较连续的行的一种方式:
SELECT
MIN(T2.DATA - T1.DATA) AS Dif
FROM
Abc T1 INNER JOIN Abc T2 on T1.DATA < T2.DATA
ORDER BY
T1.DATA
'在T1.DATA
@prajeeshkumar如果连接不是'MIN()',那么连接将是三角形的'(x * x + x)/ 2',这确保了行匹配1:1,除了最后一行不匹配任何东西。结果是“x-1”行。 – 2012-03-14 20:07:32
这似乎只适用于单调递增的数据集,不是吗?我错过了什么?当我运行它时,我得到一个单例(当值之间没有差异时)或不正确的时间差异(当数据集非单调时)。 – DrFriedParts 2013-04-26 03:36:33
使用用户定义的变量:
SET @prevValue:=0;
SELECT [email protected] AS diff,@prevValue:=value FROM t;
您必须丢弃您的案例的第一行。
如果表中同时包含value
和diff
领域,可以设置与diff
领域:
SET @prevValue:=0;
UPDATE t SET diff=IF((@d:[email protected]) AND (@prevValue:=value),@d,@d);
使用IF
是唯一的方法,我可以找到都设置diff
和更新@prevValue
变量。
awsome答案.....很棒.. – Ajay2707 2017-11-29 07:20:05
这是一列,而不是一排,它只是巧合排序。除非在SQL语句中使用ORDER BY子句,否则MySQL可以以任何顺序返回数据。 – 2012-03-14 06:14:44