teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

詳細の書き込み

2019/11/21 17:42

投稿

shirana
shirana

スコア4

title CHANGED
File without changes
body CHANGED
@@ -11,6 +11,62 @@
11
11
  2 1 0 0 201
12
12
  2 0 0 0 201
13
13
  2 1 0 0 201
14
+ 2 1 1 0 202
15
+ 2 1 1 0 202
16
+ 2 0 1 0 202
17
+ 2 1 1 0 202
14
18
  このようなデータがあった場合にbidグループ内でlast=1のもののみで平均を計算、last=1以外のものに対してlast_resulstの部分に計算結果を入れ、last=2に更新するようなものです。
15
19
  更新したいのはlast=1の値が存在するbid=200のグループのみなのですが
16
- どうしてもすべてのlast=0の部分がlast=2にupdateされてしまいます。
20
+ どうしてもすべてのlast=0の部分がlast=2にupdateされてしまいます。
21
+
22
+ 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;
23
+
24
+ といった命令をします。 省略して書いてるのでもしかしたら動かないかもしれないですが、
25
+
26
+ id result last last_result bid
27
+ 2 1 1 0 200
28
+ 2 1 2 1 200
29
+ 2 0 2 1 200
30
+ 2 1 1 0 200
31
+ 2 1 0 0 201
32
+ 2 1 0 0 201
33
+ 2 0 0 0 201
34
+ 2 1 0 0 201
35
+ 2 1 1 0 202
36
+ 2 1 1 0 202
37
+ 2 0 1 0 202
38
+ 2 1 1 0 202
39
+
40
+ となるようにしています。
41
+ ここで
42
+ bid = 201にしたときに
43
+ id result last last_result bid
44
+ 2 1 1 0 200
45
+ 2 1 0 1 200
46
+ 2 0 0 1 200
47
+ 2 1 1 0 200
48
+ 2 1 2 0 201
49
+ 2 1 2 0 201
50
+ 2 0 2 0 201
51
+ 2 1 2 0 201
52
+ 2 1 1 0 202
53
+ 2 1 1 0 202
54
+ 2 0 1 0 202
55
+ 2 1 1 0 202
56
+
57
+ となってしまいます。ここでの理想は、bid = 201 のグループにはlast = 1 であるものがないので last = 0 のままとなる下記です
58
+ id result last last_result bid
59
+ 2 1 1 0 200
60
+ 2 1 0 1 200
61
+ 2 0 0 1 200
62
+ 2 1 1 0 200
63
+ 2 1 0 0 201
64
+ 2 1 0 0 201
65
+ 2 0 0 0 201
66
+ 2 1 0 0 201
67
+ 2 1 1 0 202
68
+ 2 1 1 0 202
69
+ 2 0 1 0 202
70
+ 2 1 1 0 202
71
+
72
+ このようなことに対して、どのようにwhere句を指定すればいいのでしょうか?