Pergunta

Suponha que eu tenho esse código

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

dando a este

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

Como faço para calcular uma coluna de valores de 'b', onde cada um é a diferença entre o valor de 'a' na linha atual e o valor de 'a' na linha anterior?

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

Isso é tão óbvio no OpenOffice ou excel que me sinto um pouco bobo não ter ainda encontrado como fazer isso no site da MySql, nem em qualquer outro lugar.

Foi útil?

Solução

Seria mais fácil se você tiver uma coluna auto_increment para dar cada linha o seu próprio ID - então você pode juntar-se a mesa contra si mesma em (alias2.id = alias1.id + 1) e calcular o diff de alias2.a-nome1 .a

Como é, eu acho que a única maneira é com uma subconsulta para obter o maior valor a menos do que o valor de linha atual, que vai ser muito ineficiente.

Então, se você pode, modificar seu esquema!

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

Use junção interna em vez de um direito se juntar, se você não quer que o primeiro resultado zero.

Editar: veja este artigo para uma explicação mais completa sobre essa idéia: Cálculo diferenças entre linhas sucessivas

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top