2012-03-14 36 views
8

Como soy nuevo en MySQL, esta pregunta puede ser una tontería. ¿Cómo puedo encontrar la diferencia entre filas sucesivas?
Ejemplo:
Una tabla (nombreTabla = 'Abc') contiene una sola fila de la siguiente manera,Consulta para encontrar la diferencia entre filas sucesivas en Mysql

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

aquí quiero obtener la salida como,

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

¿Cómo encontrar la diferencia como esto sin ningún índice (primario o Auto_incremento)?

+1

Es una columna, no una fila, y solo se ha pedido casualmente. A menos que use una cláusula ORDER BY en una declaración de SQL, MySQL puede devolver los datos en cualquier orden. –

Respuesta

4

Lo mejor sería hacer esto fuera de la base de datos haciendo un seguimiento de la fila anterior. Aquí hay algo de código (espero que mi php no es demasiado oxidado):

<?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]; 

} 

?> 

Si tiene que hacerlo dentro de la db, por alguna razón, entonces probablemente lo mejor sería crear un procedimiento almacenado que básicamente va a hacer la misma cosa : crea una instancia de una variable con el valor 0, informa la diferencia para cada fila y esa variable, luego establece la variable en el valor de la fila.

Editado para añadir una cláusula order by Como señaló John Escoja

9

Una autocombinación es una manera de comparar filas consecutivas:

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

'en T1.DATA

+1

@prajeeshkumar La unión sería triangular '(x * x + x)/2' si no fuera por' MIN() ', que asegura que las filas coincidan 1: 1, excepto la última fila, que no coincide cualquier cosa. El resultado es 'x-1' filas. –

+2

Esto parece funcionar solo para conjuntos de datos que aumentan monótonamente, ¿no? ¿Me he perdido algo? Cuando lo ejecuto, obtengo un singleton (cuando no hay diferencias entre los valores) o una diferencia de tiempo incorrecta (cuando el conjunto de datos no es monotónico). – DrFriedParts

7

Usar variables definidas por el usuario:

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

Tendrás que descartar la primera fila para tu caso.

Si la tabla contiene tanto value y diff campos, se puede establecer el campo diff con:

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

Utilizando el IF es la única manera que pude encontrar para tanto establecer diffy actualización de la @prevValue variable.

+0

impresionante respuesta ..... gran ... – Ajay2707

Cuestiones relacionadas