回答編集履歴

3

chousei

2019/07/01 04:17

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -187,3 +187,29 @@
187
187
  order by pid
188
188
 
189
189
  ```
190
+
191
+ - 結果
192
+
193
+
194
+
195
+ |pid|SC|cvolume|avg|avg_per|Date|
196
+
197
+ |--:|--:|--:|--:|:--|:--:|
198
+
199
+ |1|1000|900|475|1.894736842105263|2019-06-27 15:00:00|
200
+
201
+ |3|1000|500|425|1.1764705882352942|2019-06-25 15:00:00|
202
+
203
+ |4|1000|400|325|1.2307692307692308|2019-06-24 15:00:00|
204
+
205
+ |5|1000|600|275|2.1818181818181817|2019-06-21 15:00:00|
206
+
207
+ |11|2000|500|275|1.8181818181818181|2019-06-25 15:00:00|
208
+
209
+ |12|2000|300|225|1.3333333333333333|2019-06-24 15:00:00|
210
+
211
+ |19|3000|900|700|1.2857142857142858|2019-06-25 15:00:00|
212
+
213
+ |20|3000|900|550|1.6363636363636365|2019-06-24 15:00:00|
214
+
215
+ |21|3000|900|375|2.4|2019-06-21 15:00:00|

2

調整

2019/07/01 04:17

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -5,3 +5,185 @@
5
5
 
6
6
 
7
7
  selectの中でlimitを利用した集計をするのもよくない
8
+
9
+
10
+
11
+ # 調整
12
+
13
+
14
+
15
+ - テーブル作成
16
+
17
+ テーブルにdbという名前をつけるのはよくないのでtblに変更しておきます
18
+
19
+ 設計上Dateにインデックスを貼ります
20
+
21
+ ```SQL
22
+
23
+ CREATE TABLE tbl(
24
+
25
+ pid int primary key auto_increment,
26
+
27
+ SC int(4) NOT NULL,
28
+
29
+ todays_close double,
30
+
31
+ ago_close double,
32
+
33
+ volume double,
34
+
35
+ `Date` datetime NOT NULL,
36
+
37
+ index(Date)
38
+
39
+ );
40
+
41
+ insert into tbl(SC,todays_close,ago_close,volume,Date) values
42
+
43
+ (1000,100,90,900,'2019-06-27 15:00:00'),
44
+
45
+ (1000,91,87,100,'2019-06-26 15:00:00'),
46
+
47
+ (1000,88,87,500,'2019-06-25 15:00:00'),
48
+
49
+ (1000,87,81,400,'2019-06-24 15:00:00'),
50
+
51
+ (1000,80,76,600,'2019-06-21 15:00:00'),
52
+
53
+ (1000,79,73,200,'2019-06-20 15:00:00'),
54
+
55
+ (1000,73,72,100,'2019-06-19 15:00:00'),
56
+
57
+ (1000,72,71,200,'2019-06-18 15:00:00'),
58
+
59
+ (2000,100,90,300,'2019-06-27 15:00:00'),
60
+
61
+ (2000,90,93,300,'2019-06-26 15:00:00'),
62
+
63
+ (2000,93,90,500,'2019-06-25 15:00:00'),
64
+
65
+ (2000,90,64,300,'2019-06-24 15:00:00'),
66
+
67
+ (2000,63,78,100,'2019-06-21 15:00:00'),
68
+
69
+ (2000,78,75,200,'2019-06-20 15:00:00'),
70
+
71
+ (2000,75,84,300,'2019-06-19 15:00:00'),
72
+
73
+ (2000,81,73,400,'2019-06-18 15:00:00'),
74
+
75
+ (3000,90,100,900,'2019-06-27 15:00:00'),
76
+
77
+ (3000,100,90,900,'2019-06-26 15:00:00'),
78
+
79
+ (3000,90,100,900,'2019-06-25 15:00:00'),
80
+
81
+ (3000,100,90,900,'2019-06-24 15:00:00'),
82
+
83
+ (3000,90,100,900,'2019-06-21 15:00:00'),
84
+
85
+ (3000,90,88,100,'2019-06-20 15:00:00'),
86
+
87
+ (3000,87,81,300,'2019-06-19 15:00:00'),
88
+
89
+ (3000,81,76,200,'2019-06-18 15:00:00');
90
+
91
+ ```
92
+
93
+ - ビュー作成
94
+
95
+
96
+
97
+ 日付データだけを抜き出すため日ビューを作ります。
98
+
99
+ ```SQL
100
+
101
+ create view vw as
102
+
103
+ select Date,
104
+
105
+ (select count(*)+1 from (select distinct Date from tbl) as t2 where Date>t1.Date ) as rank
106
+
107
+ from (select distinct Date from tbl) as t1;
108
+
109
+ ```
110
+
111
+ - 確認
112
+
113
+ ```SQL
114
+
115
+ select * from vw;
116
+
117
+ ```
118
+
119
+
120
+
121
+ |Date|rank|
122
+
123
+ |:--:|:--:|
124
+
125
+ |2019-06-18 15:00:00|8|
126
+
127
+ |2019-06-19 15:00:00|7|
128
+
129
+ |2019-06-20 15:00:00|6|
130
+
131
+ |2019-06-21 15:00:00|5|
132
+
133
+ |2019-06-24 15:00:00|4|
134
+
135
+ |2019-06-25 15:00:00|3|
136
+
137
+ |2019-06-26 15:00:00|2|
138
+
139
+ |2019-06-27 15:00:00|1|
140
+
141
+
142
+
143
+
144
+
145
+ - 検索
146
+
147
+
148
+
149
+ 過去4日というのは3日前までなのでn=3とします
150
+
151
+
152
+
153
+ ```SQL
154
+
155
+ set @n=3,@x=1;
156
+
157
+ select
158
+
159
+ t2.pid,
160
+
161
+ max(t2.SC) as SC,
162
+
163
+ max(t2.volume) as volume,
164
+
165
+ avg(t3.volume) as avg,
166
+
167
+ max(t2.volume)/avg(t3.volume) as avg_per,
168
+
169
+ max(t2.Date) as Date
170
+
171
+ from tbl as t2
172
+
173
+ inner join (select Date,(select Date from vw where rank = v1.rank -@n) as Date_After from vw as v1) as v2
174
+
175
+ on t2.Date=v2.Date_After
176
+
177
+ inner join tbl as t3
178
+
179
+ on t3.Date between v2.Date and v2.Date_After
180
+
181
+ and t2.SC=t3.SC
182
+
183
+ group by pid
184
+
185
+ having avg_per>@x
186
+
187
+ order by pid
188
+
189
+ ```

1

chousei

2019/07/01 04:12

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -1,3 +1,7 @@
1
1
  n日があいまい
2
2
 
3
3
  24日→21日が22,23日を飛ばして1日とするかどうかで全然違う
4
+
5
+
6
+
7
+ selectの中でlimitを利用した集計をするのもよくない