1

私がこのコードを持っているとしましょう

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のサイトや他の場所でこれを行う方法をまだ見つけていないのは少しばかげていると感じます。

4

1 に答える 1

2

auto_increment列を使用して、各行に独自のIDを指定すると、(alias2.id = alias1.id + 1)でテーブルを結合し、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 |
+------+------+

最初のゼロの結果が必要ない場合は、右結合ではなく内部結合を使用してください。

編集:このアイデアの完全なウォークスルーについては、この記事を参照してください:連続する行間の差異の計算

于 2009-02-16T17:55:21.453 に答える