質問編集履歴
1
取り組んだこと が消えていたので追加しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
## 実現したいこと
|
2
2
|
次のようなテーブルがあったとして
|
3
3
|
|
4
|
+
SampleTable
|
4
5
|
|id|value|
|
5
6
|
|---|---|
|
6
7
|
|1|+|
|
@@ -27,6 +28,7 @@
|
|
27
28
|
|
28
29
|
次のような結果を得たいと思っています。
|
29
30
|
|
31
|
+
ResultTable
|
30
32
|
|id|value|
|
31
33
|
|---|---|
|
32
34
|
|1|+|
|
@@ -36,4 +38,57 @@
|
|
36
38
|
便宜的に+, -で表現しています。)
|
37
39
|
|
38
40
|
|
39
|
-
## 取り組んだこと
|
41
|
+
## 取り組んだこと
|
42
|
+
|
43
|
+
条件として、
|
44
|
+
- `SampleTable.id - 1`の`value`が`-`なら表示しない
|
45
|
+
|
46
|
+
であればよいので、caseを使って表現できる気がしますが、うまく書けません。
|
47
|
+
caseでflg列を作り、
|
48
|
+
|
49
|
+
ImmidiateTable
|
50
|
+
|id|value|flg|
|
51
|
+
|---|---|---|
|
52
|
+
|1|+|true|
|
53
|
+
|2|+|true|
|
54
|
+
|3|-|false|
|
55
|
+
|4|-|false|
|
56
|
+
|5|+|false|
|
57
|
+
|
58
|
+
となったところで、`select * from ImmidiateTable where flg = true`とし、
|
59
|
+
ResultTableができると思いましたが、
|
60
|
+
|
61
|
+
|
62
|
+
`left join (select * from SampleTable as RT where RT.id = SampleTable.id -1) as ReplicaTable`で、ReplicaTableに対して
|
63
|
+
ひとつ前のidのvalueが`-`なら`flg = false`とすると、ちょっとSampleTableからデータが変わってしまいますが
|
64
|
+
|
65
|
+
EvaluatedTable
|
66
|
+
|id|value|flg|
|
67
|
+
|--|--|--|
|
68
|
+
|1|-|false|
|
69
|
+
|2|+|`false`|
|
70
|
+
|3|+|`true`|
|
71
|
+
|4|-|false|
|
72
|
+
|5|+|false|
|
73
|
+
|
74
|
+
と、愚直に自分のひとつ前のidのSampleTableのvalueを参照し、flgを出力してしまう結果となりました。
|
75
|
+
つまり、ひとつ前のflgについて評価した自分自身をもう一度評価する必要があって、
|
76
|
+
(なんていうんでしょうか、`original left join original.id -1`(SampleTable = original)を横方向に評価し、
|
77
|
+
次にこの結果自体を縦方向に評価しなければいけない....というか)
|
78
|
+
|
79
|
+
```
|
80
|
+
(
|
81
|
+
EvaluatedTable
|
82
|
+
ReplicaTable
|
83
|
+
SampleTable
|
84
|
+
|
85
|
+
EvaluatedTable. id - 1
|
86
|
+
ReplicaTable
|
87
|
+
SampleTable
|
88
|
+
) as ResultTable
|
89
|
+
```
|
90
|
+
|
91
|
+
と、同じ構造を持つクエリが二重に必要になり、可読性、メンテナンス共々に悪すぎます。
|
92
|
+
考え方自体が間違っている気がしますし、whileのような仕組みがそもそもあればよいのですが
|
93
|
+
検索しても見つかりません。
|
94
|
+
スマートに実現できる方法が分かる方、ぜひご教示お願いします。
|