MySql движущиеся различия? - PullRequest
       11

MySql движущиеся различия?

1 голос
/ 16 февраля 2009

Предположим, у меня есть этот код

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|
+--+

Как рассчитать столбец значений «b», где каждый представляет собой разницу между значением «a» в текущей строке и значением «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 или excel, что я чувствую себя немного глупо, пока не нашёл, как это сделать на сайте MySql и нигде больше.

1 Ответ

2 голосов
/ 16 февраля 2009

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

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

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

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 |
+------+------+

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

Редактировать: более подробное описание этой идеи см. В этой статье: Расчет различий между последовательными строками

...