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

質問編集履歴

1

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

2018/07/13 10:35

投稿

yokatone
yokatone

スコア43

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
+ スマートに実現できる方法が分かる方、ぜひご教示お願いします。