Запрос, чтобы найти разницу между последовательными строками в Mysql - PullRequest
8 голосов
/ 14 марта 2012

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

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

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

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

Как найти такую ​​разницу без какого-либо индекса (основного или Auto_increment)?

Ответы [ 3 ]

9 голосов
/ 14 марта 2012

Самостоятельное объединение - это один из способов сравнения последовательных строк:

SELECT
    MIN(T2.DATA - T1.DATA) AS Dif
FROM
    Abc T1 INNER JOIN Abc T2 on T1.DATA < T2.DATA
ORDER BY
    T1.DATA
7 голосов
/ 09 августа 2013

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

SET @prevValue:=0;
SELECT value-@prevValue AS diff,@prevValue:=value FROM t;

Вам придется отбросить первую строку для вашего случая.

Если таблица содержит поля value и diffВы можете установить поле diff с помощью:

SET @prevValue:=0;
UPDATE t SET diff=IF((@d:=value-@prevValue) AND (@prevValue:=value),@d,@d);

Использование IF - единственный способ найти и set diff и обновить @prevValue переменную.

4 голосов
/ 14 марта 2012

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

Отредактировано, чтобы добавить заказ по пункту, как отметил Джон Пик

...