mysql:11047
From: 柴垣 <柴垣 <akiro@xxxxxxxxxx>>
Date: Sat, 26 Feb 2005 13:03:58 +0900
Subject: [mysql 11047] Re: 累積を計算するSQLは
柴垣です。長尾さん、佐々木さん、ありがとうございます。 >( 長尾さんwrote:) 全部 SQLでやる必要はないのではないでしょうか? >(佐々木さんwrote:)こんな感じでどうかな > select ID, Value + > ifnull((select sum(b.Value) from table as b where b.id < a.id), 0) as Sum > from table as a 佐々木さんのSQL 文は、こちらのMySQL のバージョンが、3.23.55 のためか、 うまく動きませんでした。そこで、それを参考にしながら、以下のようなSQL 文をつくり、うまく動作させることができました。 select a.id, sum(b.Value) as sum from tbl as a,tbl as b where b.id<=a.id group by a.id; ただ、長尾さんに指摘されたことなのですが、受け取った結果の集計なら 単純に Value を足し合わせていくだけですが、上のSQL文では、行ごとに 集計範囲の条件を調べながら、その都度集計をしていくことになって、 全体の計算量は、行が増えるにつれて、行数の2乗のオーダーで増えて いくことになってしまいます。 これは避けたほうがいいやり方なのか、それともそれでも「サーバー側に やらせている」という意味ではSQL 文として、妥当な手法なのでしょうか。 もっといい方法がある、というのも含めて、意見がお聞きできればと 思います。(今回は、結果を操作する余地があまりない場面なので、 このままつかうことになりそうですが・・・。) > > SQL文で、累積を計算していくものは書けないでしょうか。 > > 具体的には、下記のようなデータセットがあって、 > > > > ID Value > > ------------- > > 1 5 > > 2 3 > > 3 7 > > 4 12 > > 5 8 > > ..... > > > > これから、 > > > > ID Sum > > ------------- > > 1 5 > > 2 8 > > 3 15 > > 4 27 > > 5 35 > > .... > > > > という具合に、 > > _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ > > > > 柴垣 顕郎 akiro@xxxxxxxxxx > > > > _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ > > > > > > > > > > > _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 柴垣 顕郎 akiro@xxxxxxxxxx _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
11044 2005-02-26 04:18 [柴垣 <akiro@xxxxxxxx] 累積を計算するSQLは 11045 2005-02-26 10:47 ┣[tadashi nagao <tadas] 11046 2005-02-26 10:48 ┣[佐々木 祐 <yuu_sasak] -> 11047 2005-02-26 13:03 ┃┗[柴垣 <akiro@xxxxxxxx] 11048 2005-02-26 13:34 ┃ ┣[tadashi nagao <tadas] 11049 2005-02-26 15:24 ┃ ┣[一山昌紀 <icchan@xxx] 11050 2005-02-26 17:43 ┃ ┃┗[柴垣 <akiro@xxxxxxxx] 11051 2005-02-27 18:09 ┃ ┃ ┗[遠藤 俊裕 <endo@xxxx] 11059 2005-02-28 12:00 ┃ ┗["waya" <wayama@xxxxx] 11067 2005-02-28 13:56 ┗[班石悦夫 <madara@xxx] 11077 2005-02-28 14:28 ┣[柴垣 <akiro@xxxxxxxx] 11080 2005-02-28 14:45 ┗[一山 昌紀 <icchan@xx] 11089 2005-02-28 15:37 ┗[班石悦夫 <madara@xxx] 11093 2005-02-28 15:55 ┗[一山 昌紀 <icchan@xx]