回答編集履歴

5

追記

2019/06/08 03:37

投稿

sazi
sazi

スコア25188

test CHANGED
@@ -17,3 +17,93 @@
17
17
  on ta.日付=tc.日付
18
18
 
19
19
  ```
20
+
21
+ 追記
22
+
23
+ --
24
+
25
+ MySQL8.0は**with**や**分析関数**が使えるので利用すると簡潔になります。
26
+
27
+ MySQL8.0は手元にないのでpostgresを使用して検証しました。
28
+
29
+
30
+
31
+ キーワードとしては**with**と**lag**位ですね。
32
+
33
+ 最終的に相関副問合せを用いてますが、集計を別テーブルに分けて結合する方法もあると思います。
34
+
35
+ 現状インデックスが無いなら使い物にならないほど低速です。
36
+
37
+ また、日付と証券コードで一意になっていないのも前日比などでは問題です。
38
+
39
+ ```SQL
40
+
41
+ with
42
+
43
+ date_range as (
44
+
45
+ -- 指定した期間内(最新日付より過去7日)
46
+
47
+ select date from b hst
48
+
49
+ where date <= (select max(date) from b)
50
+
51
+ and (select count(*) from b where date>=hst.date)<=7
52
+
53
+ )
54
+
55
+ , peak as (
56
+
57
+ --期間高値:指定した期間内の最高値、最安値
58
+
59
+ select STOCK_CD, STOCK_NAME, Max(HIGH) max_peak, Min(LOW) min_peak
60
+
61
+ from a where date in (select date from date_range)
62
+
63
+ group by STOCK_CD, STOCK_NAME
64
+
65
+ )
66
+
67
+ , rasio as (
68
+
69
+ --前日比 :テーブルB内にある最新日の終値とその前営業日の終値との比較
70
+
71
+ select date, STOCK_CD
72
+
73
+ , close - lag(CLOSE) over (partition by STOCK_CD order by date) rasio
74
+
75
+ from a
76
+
77
+ )
78
+
79
+ select pk.*
80
+
81
+ --・高値日 :期間高値を付けた日
82
+
83
+ , (select max(date) from a
84
+
85
+ where STOCK_CD=pk.STOCK_CD and HIGH=pk.max_peak
86
+
87
+ and date in (select date from date_range)
88
+
89
+ )
90
+
91
+ --・安値日 :期間安値を付けた日
92
+
93
+ , (select max(date) from a
94
+
95
+ where STOCK_CD=pk.STOCK_CD and LOW=pk.min_peak
96
+
97
+ and date in (select date from date_range)
98
+
99
+ )
100
+
101
+ , (select max(rasio) from rasio
102
+
103
+ where date = (select max(date) from b) and STOCK_CD=pk.STOCK_CD
104
+
105
+ )
106
+
107
+ from peak pk
108
+
109
+ ```

4

訂正

2019/06/08 03:37

投稿

sazi
sazi

スコア25188

test CHANGED
@@ -6,11 +6,11 @@
6
6
 
7
7
  from ta inner join (
8
8
 
9
- select * from tb
9
+ select * from tb t1
10
10
 
11
11
  where 日付 <= date()
12
12
 
13
- and (select count(*) from tb where 日付>=ta.日付)<=7
13
+ and (select count(*) from tb where 日付>=t1.日付)<=7
14
14
 
15
15
  ) tc
16
16
 

3

訂正

2019/06/05 15:10

投稿

sazi
sazi

スコア25188

test CHANGED
@@ -14,6 +14,6 @@
14
14
 
15
15
  ) tc
16
16
 
17
- on ta.日付=tb.日付
17
+ on ta.日付=tc.日付
18
18
 
19
19
  ```

2

推敲

2019/06/05 15:10

投稿

sazi
sazi

スコア25188

test CHANGED
@@ -1,4 +1,4 @@
1
- 取り敢えず集計していないQSLです。
1
+ 取り敢えず集計していないSQLです。
2
2
 
3
3
  ```SQL
4
4
 

1

訂正

2019/06/05 15:09

投稿

sazi
sazi

スコア25188

test CHANGED
@@ -1,14 +1,16 @@
1
+ 取り敢えず集計していないQSLです。
2
+
1
3
  ```SQL
2
4
 
3
5
  select ta.*
4
6
 
5
- from t1 inner join (
7
+ from ta inner join (
6
8
 
7
9
  select * from tb
8
10
 
9
11
  where 日付 <= date()
10
12
 
11
- and (select count(*) from tb where 日付>=tb.日付)<=7
13
+ and (select count(*) from tb where 日付>=ta.日付)<=7
12
14
 
13
15
  ) tc
14
16