質問編集履歴

1

取り組んだこと が消えていたので追加しました。

2018/07/13 10:35

投稿

yokatone
yokatone

スコア43

test CHANGED
File without changes
test CHANGED
@@ -3,6 +3,8 @@
3
3
  次のようなテーブルがあったとして
4
4
 
5
5
 
6
+
7
+ SampleTable
6
8
 
7
9
  |id|value|
8
10
 
@@ -56,6 +58,8 @@
56
58
 
57
59
 
58
60
 
61
+ ResultTable
62
+
59
63
  |id|value|
60
64
 
61
65
  |---|---|
@@ -75,3 +79,109 @@
75
79
 
76
80
 
77
81
  ## 取り組んだこと
82
+
83
+
84
+
85
+ 条件として、
86
+
87
+ - `SampleTable.id - 1`の`value`が`-`なら表示しない
88
+
89
+
90
+
91
+ であればよいので、caseを使って表現できる気がしますが、うまく書けません。
92
+
93
+ caseでflg列を作り、
94
+
95
+
96
+
97
+ ImmidiateTable
98
+
99
+ |id|value|flg|
100
+
101
+ |---|---|---|
102
+
103
+ |1|+|true|
104
+
105
+ |2|+|true|
106
+
107
+ |3|-|false|
108
+
109
+ |4|-|false|
110
+
111
+ |5|+|false|
112
+
113
+
114
+
115
+ となったところで、`select * from ImmidiateTable where flg = true`とし、
116
+
117
+ ResultTableができると思いましたが、
118
+
119
+
120
+
121
+
122
+
123
+ `left join (select * from SampleTable as RT where RT.id = SampleTable.id -1) as ReplicaTable`で、ReplicaTableに対して
124
+
125
+ ひとつ前のidのvalueが`-`なら`flg = false`とすると、ちょっとSampleTableからデータが変わってしまいますが
126
+
127
+
128
+
129
+ EvaluatedTable
130
+
131
+ |id|value|flg|
132
+
133
+ |--|--|--|
134
+
135
+ |1|-|false|
136
+
137
+ |2|+|`false`|
138
+
139
+ |3|+|`true`|
140
+
141
+ |4|-|false|
142
+
143
+ |5|+|false|
144
+
145
+
146
+
147
+ と、愚直に自分のひとつ前のidのSampleTableのvalueを参照し、flgを出力してしまう結果となりました。
148
+
149
+ つまり、ひとつ前のflgについて評価した自分自身をもう一度評価する必要があって、
150
+
151
+ (なんていうんでしょうか、`original left join original.id -1`(SampleTable = original)を横方向に評価し、
152
+
153
+ 次にこの結果自体を縦方向に評価しなければいけない....というか)
154
+
155
+
156
+
157
+ ```
158
+
159
+ (
160
+
161
+ EvaluatedTable
162
+
163
+ ReplicaTable
164
+
165
+ SampleTable
166
+
167
+
168
+
169
+ EvaluatedTable. id - 1
170
+
171
+ ReplicaTable
172
+
173
+ SampleTable
174
+
175
+ ) as ResultTable
176
+
177
+ ```
178
+
179
+
180
+
181
+ と、同じ構造を持つクエリが二重に必要になり、可読性、メンテナンス共々に悪すぎます。
182
+
183
+ 考え方自体が間違っている気がしますし、whileのような仕組みがそもそもあればよいのですが
184
+
185
+ 検索しても見つかりません。
186
+
187
+ スマートに実現できる方法が分かる方、ぜひご教示お願いします。