Pregunta

Supongamos que tengo este 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|
+--+

¿Cómo se calcula una columna de valores 'b', donde cada uno es la diferencia entre el valor de 'a' en la fila actual y el valor de 'a' en la fila anterior?

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

Esto es tan obvio en openoffice o Excel que me siento un poco tonto no haber encontrado aún cómo hacer esto en el sitio de MySQL ni en ningún otro lugar.

¿Fue útil?

Solución

Sería más fácil si tuviera una columna AUTO_INCREMENT para dar a cada fila de su propio ID - entonces usted podría unirse a la mesa contra sí mismo en (alias2.id = alias1.id + 1) y calcular el diff de alias2.a-alias1 .a

Como es, creo que la única forma de hacerlo es con una subconsulta para obtener el valor más grande de una menor que el valor de la fila actual, que será muy ineficaz.

Así que si se puede modificar el 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 |
+------+------+

Utilice combinación interna en lugar de un derecho unirse si no quiere que el primer resultado cero.

Editar: ver este artículo para obtener un tutorial más completo de esta idea: Cálculo de diferencias entre filas sucesivas

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top