2009-02-16 2 views
1

Предположим, у меня есть этот кодMySql движущиеся различия?

create temporary table somedata (a integer); 
insert into somedata (a) values (11), (25), (62); --#these values are always increasing 
select * from somedata; 

давая это

+--+ 
|a | 
+--+ 
|11| 
|25| 
|62| 
+--+ 

Как вычислить столбец значений «Ъ», где каждый из них представляет собой разницу между значением «а» в текущем строка и значение 'a' в предыдущей строке?

+--+--+ 
|a |b | 
+--+--+ 
|11| 0| # ie 11-11 since theres no preceding row 
|25|14| # ie 25-11 
|62|37| # ie 62-25 etc 
+--+--+ 

Это настолько очевидно, в OpenOffice или преуспеть, что я чувствую себя немного глупо, не то, но не нашел, как это сделать на сайте MySql, ни в любом другом месте.

+0

Это очевидно в таблице, потому что делает эти вещи является важным компонентом модели данных. Предпосылка реляционной модели данных (google: // реляционная алгебра) заключается в том, что каждая таблица является неупорядоченным набором независимых строк - понятие «следующая» или «предыдущая» строка не существует. –

ответ

2

Было бы проще, если бы у вас был столбец auto_increment, чтобы дать каждой строке свой собственный идентификатор - тогда вы можете присоединиться к таблице против себя (alias2.id = alias1.id + 1) и рассчитать diff от alias2.a- alias1.a

Как бы то ни было, я думаю, что единственный способ заключается в подзапросе, чтобы получить наибольшее значение меньше значения текущей строки, что будет очень неэффективным.

Так что, если можно, измените свою схему!

create table somedata (
    id int auto_increment not null, 
    a integer, 
    primary key(id) 
); 
insert into somedata (a) values (11), (25), (62); 

select a2.a,ifnull(a2.a-a1.a, 0) as diff 
from somedata as a1 
right join somedata as a2 on (a2.id=a1.id+1); 

+------+------+ 
| a | diff | 
+------+------+ 
| 11 | 0 | 
| 25 | 14 | 
| 62 | 37 | 
+------+------+ 

Используйте внутреннее соединение, а не правое соединение, если вы не хотите, чтобы первый нулевой результат.

Edit: увидеть эту статью для более полного пошагового этой идеи: Calculating differences between successive rows

+0

Отлично! Спасибо за подсказку Пол. Эта ссылка выглядит очень полезной. – kalyanji

+0

Быстрый совет: если вы не можете изменить свою схему, создайте временную таблицу с идентификатором в своем proc, дампьте свой набор результатов туда, а затем выполните соединение. – TheSmurf