2012-03-14 13 views
8

Siccome sono nuovo a MySQL, questa domanda potrebbe essere sciocca. Come posso trovare la differenza tra le righe successive?
Esempio:
Una tabella (tableName = 'Abc') contiene una singola riga come segue,Query per trovare la differenza tra le righe successive in Mysql

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

qui voglio ottenere l'output come,

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

come trovare la differenza come questo senza alcun indice (primario o Auto_increment)?

+1

Questa è una colonna, non una riga, ed è solo per coincidenza ordinata. A meno che non si utilizzi una clausola ORDER BY in un'istruzione SQL, MySQL può restituire i dati in qualsiasi ordine. –

risposta

4

Sarebbe meglio farlo al di fuori del DB tenendo traccia della riga precedente. Ecco qualche codice (si spera il mio php non è troppo arrugginito):

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

} 

?> 

Se avete bisogno di farlo all'interno del db per qualche ragione, allora probabilmente sarebbe meglio per creare una stored procedure, che sarà essenzialmente la stessa cosa : crea un'istanza di una variabile con valore 0, segnala la differenza per ogni riga e quella variabile, quindi imposta la variabile sul valore della riga.

Edited per aggiungere un ordine dalla clausola Come notato da John Prelievo

9

Un auto collegamento è un modo per confrontare righe consecutive:

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

'su T1.DATA

+1

@prajeeshkumar Il join sarebbe triangolare '(x * x + x)/2' se non fosse per' MIN() ', che assicura che le righe corrispondano a 1: 1, tranne l'ultima riga, che non corrisponde nulla. Il risultato sono le righe 'x-1'. –

+2

Sembra funzionare solo per set di dati monotonicamente crescenti, no? Ho dimenticato qualcosa? Quando lo eseguo, ottengo o un singleton (quando non ci sono differenze tra i valori) o una differenza temporale errata (quando il set di dati non è monotono). – DrFriedParts

7

Usa definiti dall'utente variabili:

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

Dovrai scartare la prima riga per il tuo caso.

Se la tabella contiene sia value e diff campi, è possibile impostare il campo diff con:

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

Utilizzando la IF è l'unico modo che ho trovato per sia impostare diffe aggiornamento il @prevValue variabile.

+0

risposta awsome ..... ottimo .. – Ajay2707