2012-03-14 5 views
8

Поскольку я новичок в MySQL, этот вопрос может быть глупым. Как я могу найти разницу между последовательными строками?
Пример:
таблица (TABLENAME = 'Abc') содержит одну строку следующим образом,Запрос, чтобы найти разницу между последовательными строками в Mysql

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

Здесь я хочу получить результат, как,

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

Как найти разницу, как это без какого-либо индекса (первичный или автоматический_инкремент)?

+1

Это столбец, а не строка, и это только по порядку. Если вы не используете предложение ORDER BY в выражении SQL, MySQL может возвращать данные в любом порядке. –

ответ

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, сообщить разницу для каждой строки и этой переменной, а затем установить переменную в значение строки.

Edited добавить заказ по статье, как отметил Джон Pick

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

+1

@prajeeshkumar Соединение будет треугольным '(x * x + x)/2', если бы оно не было для' MIN() ', что гарантирует соответствие строк 1: 1, за исключением последней строки, которая не соответствует что-нибудь. Результатом являются строки 'x-1'. –

+2

Это, похоже, работает только для монотонно увеличивающих наборов данных, нет? Я что-то пропустил? Когда я запускаю его, я получаю либо синглтон (когда нет различий между значениями), либо неправильное различие во времени (когда набор данных не является монотонным). – DrFriedParts

7

Использовать пользовательские переменные:

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 переменная.

+0

awsome answer ..... great .. – Ajay2707

Смежные вопросы