Frage

Angenommen ich diesen Code haben

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

geben diese

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

Wie berechne ich eine Spalte des Wert ‚b‘, wobei jeder ist die Differenz zwischen dem Wert von ‚a‘ in der aktuellen Zeile und den Wert von ‚a‘ in der vorangehenden Zeile?

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

Das ist so offensichtlich in Openoffice oder Excel, dass ich ein bisschen dumm nicht hat noch gefunden spüren, wie diese Website auf MySql zu tun, noch irgendwo anders.

War es hilfreich?

Lösung

Es wäre einfacher, wenn Sie eine AUTO_INCREMENT -Spalte hatte jede Zeile eine eigene ID zu geben - dann könnte man den Tisch gegen sich selbst auf (alias2.id = alias1.id + 1) verbinden und die diff von alias2.a-alias1 berechnen .a

Wie es ist, glaube ich, der einzige Weg, mit einer Unterabfrage ist den größten Wert einer kleiner als der aktuelle Zeilenwert zu erhalten, die sehr ineffizient sein wird.

Also, wenn Sie können, ändern Sie Ihr Schema!

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

Verwenden Sie innere Verknüpfung eher ein Recht kommen, wenn Sie nicht, dass erstes Null-Ergebnis wollen.

Edit: siehe diesen Artikel für einen vollständigere Durchlauf dieser Idee: Berechnen von Differenzen zwischen aufeinanderfolgenden Reihen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top