前提・実現したいこと
SQLにて、group by したものに対してupdateを行う際に、指定行があるもののみ、指定行以外の値を更新したい。
例えば
id result last last_result bid
2 1 1 0 200
2 1 0 0 200
2 0 0 0 200
2 1 1 0 200
2 1 0 0 201
2 1 0 0 201
2 0 0 0 201
2 1 0 0 201
2 1 1 0 202
2 1 1 0 202
2 0 1 0 202
2 1 1 0 202
このようなデータがあった場合にbidグループ内でlast=1のもののみで平均を計算、last=1以外のものに対してlast_resulstの部分に計算結果を入れ、last=2に更新するようなものです。
更新したいのはlast=1の値が存在するbid=200のグループのみなのですが
どうしてもすべてのlast=0の部分がlast=2にupdateされてしまいます。
update sample1 set last_result = (select avg(result) from sample1 where last = 1 and id = 2 and bid = 200 ),last = 2 where last = 0 and id = 2 and bid = 200;
といった命令をします。 省略して書いてるのでもしかしたら動かないかもしれないですが、
id result last last_result bid
2 1 1 0 200
2 1 2 1 200
2 0 2 1 200
2 1 1 0 200
2 1 0 0 201
2 1 0 0 201
2 0 0 0 201
2 1 0 0 201
2 1 1 0 202
2 1 1 0 202
2 0 1 0 202
2 1 1 0 202
となるようにしています。
ここで
bid = 201にしたときに
id result last last_result bid
2 1 1 0 200
2 1 0 1 200
2 0 0 1 200
2 1 1 0 200
2 1 2 0 201
2 1 2 0 201
2 0 2 0 201
2 1 2 0 201
2 1 1 0 202
2 1 1 0 202
2 0 1 0 202
2 1 1 0 202
となってしまいます。ここでの理想は、bid = 201 のグループにはlast = 1 であるものがないので last = 0 のままとなる下記です
id result last last_result bid
2 1 1 0 200
2 1 0 1 200
2 0 0 1 200
2 1 1 0 200
2 1 0 0 201
2 1 0 0 201
2 0 0 0 201
2 1 0 0 201
2 1 1 0 202
2 1 1 0 202
2 0 1 0 202
2 1 1 0 202
このようなことに対して、どのようにwhere句を指定すればいいのでしょうか?