2015-02-11 2 views
1

Я хочу получить разницу между двумя последовательными значениями из моей таблицы.Mysql - Получите разницу между двумя последовательными значениями

| id | count | 
| 1 | 1 | 
| 2 | 7 | 
| 3 | 9 | 
| 4 | 3 | 
| 5 | 7 | 
| 6 | 9 | 

Например разница между

id2-id1 = 6,
id3-id2 = -2,
...

Как я могу это сделать? SELECT SUM(id(x+1) - id(x)) FROM table1

+0

Вы могли бы хотеть, чтобы увидеть, если Http: // StackOverflow.com/questions/20849098/mysql-how-get-value-in-previous-row-and-value-in-next-row поможет. –

ответ

1

Вы можете использовать подзапрос, чтобы найти count за предыдущий id.

В случае, если нет пробелов в ID колонке:

SELECT CONCAT(t.`id` ,' - ', t.`id` - 1) AS `IDs` 
    , t.`count` - (SELECT `count` 
        FROM `tbl` 
        WHERE `id` = t.`id` - 1) AS `Difference` 
FROM `tbl` t 
WHERE t.`id` > 1 

SQLFiddle

В случае, если есть пробелы в ID колонке. Первое решение, используя ORDER BY <...> DESC с LIMIT 1:

SELECT CONCAT(t.id ,' - ', (SELECT `id` FROM tbl WHERE t.id > id ORDER BY id DESC LIMIT 1)) AS IDs 
    , t.`count` - (SELECT `count` 
        FROM tbl 
        WHERE t.id > id 
        ORDER BY id DESC 
        LIMIT 1) AS difference 
FROM tbl t 
WHERE t.id > 1; 

SQLFiddle

Второе решение, используя другой подзапрос, чтобы найти count с MAX(id) меньше, чем текущий id:

SELECT CONCAT(t.id ,' - ', (SELECT MAX(`id`) FROM tbl WHERE id < t.id)) AS IDs 
    , t.`count` - (SELECT `count` 
        FROM tbl 
        WHERE `id` = (SELECT MAX(`id`) 
            FROM tbl 
            WHERE id < t.id) 
        ) AS difference 
FROM tbl t 
WHERE t.id > 1; 

SQLFiddle

P.S. : Первая колонка, IDs, предназначена только для удобства чтения, вы можете опустить ее или полностью изменить, если это необходимо.

+0

, но что, если у ids есть пробелы – dasdasd

+0

@dasdasd: Обновлено – potashin

+1

Спасибо, очень помог мне. – dasdasd

1

Если вы знаете, что идентификаторы не имеют никаких пробелов, а затем просто использовать join:

select t.*, (tnext.count - t.count) as diff 
from table t join 
    table tnext 
    on t.id = tnext.id - 1; 

Если вы просто хотите, сумма различий, то это то же самое, как последнее значение минус первое значение (все промежуточные значения сокращаются при суммировании). Вы можете сделать это с limit:

select last.count - first.count 
from (select t.* from table order by id limit 1) as first cross join 
    (select t.* from table order by id desc limit 1) as last; 
0

Попробуйте это:

SELECT MAX(count)-MIN(count) diff WHERE id IN(1,2) 

Или так

SELECT 2*STD(count) diff WHERE id IN(1,2) 
0

Это работает, даже если Идентификаторы имеют расстояния между ними:

SELECT *, 
    ((SELECT value FROM example e2 WHERE e2.id > e1.id ORDER BY id ASC LIMIT 1) - value) as diff 
FROM example e1;