2012-03-14 113 views
8

由于我是MySQL的新手,这个问题可能很愚蠢。我怎样才能找到连续行之间的区别?
例子:
一个表(表名= 'ABC')包含一行如下,查询查找Mysql中连续行之间的差异

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

在这里,我想获得输出,

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

如何找到喜欢的区别这没有任何索引(主或Auto_increment)?

+1

这是一列,而不是一排,它只是巧合排序。除非在SQL语句中使用ORDER BY子句,否则MySQL可以以任何顺序返回数据。 – 2012-03-14 06:14:44

回答

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的变量,报告每行和该变量的差异,然后将该变量设置为行值。

编辑以by子句由约翰指出接

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

'在T1.DATA 2012-03-14 07:39:57

+1

@prajeeshkumar如果连接不是'MIN()',那么连接将是三角形的'(x * x + x)/ 2',这确保了行匹配1:1,除了最后一行不匹配任何东西。结果是“x-1”行。 – 2012-03-14 20:07:32

+2

这似乎只适用于单调递增的数据集,不是吗?我错过了什么?当我运行它时,我得到一个单例(当值之间没有差异时)或不正确的时间差异(当数据集非单调时)。 – DrFriedParts 2013-04-26 03:36:33

7

使用用户定义的变量:

SET @prevValue:=0; 
SELECT [email protected] AS diff,@prevValue:=value FROM t; 

您必须丢弃您的案例的第一行。

如果表中同时包含valuediff领域,可以设置与diff领域:

SET @prevValue:=0; 
UPDATE t SET diff=IF((@d:[email protected]) AND (@prevValue:=value),@d,@d); 

使用IF是唯一的方法,我可以找到设置diff更新@prevValue变量。

+0

awsome答案.....很棒.. – Ajay2707 2017-11-29 07:20:05