質問: (select max(date) from b) and STOCK_CD=pk.STOCK_CD ) from peak pk Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '--期間高値:指定した期間内の最高値、最安値 select STOCK_' at line 9 0.000 sec のエラーが返ってきました。 MySQL Workbenchdeしました。 上から use データベース名; withから始まる教えて頂いたSQLをペースト となってますがwithの左横にエラーがあった時の赤い×が付いてます。 indexについては1使い方をよく理解していないこと 2記事を探しましたがどのカラムに対して作成するのが良いのか により手を着けられていません。「現状インデックスがないなら使い物にならないほど低速」とおっしゃっている部分が非常に気になっています。 インデックスを使えば解消するのか? またよく見かける記事の「PHP+SQL」や「python+SQL」といった他プログラミング言語でのSQL操作の方が良いのか(他言語は1からの勉強となりますが・・・)。 ゆくゆくはSQL内からデータを取り出し他言語で分析というのが目的ではありますが、まずはSQLからと思い質問させていただいています。
回答: 取り敢えず集計していないSQLです。 ``` select ta.* from ta inner join ( select * from tb t1 where 日付 <= date() and (select count(*) from tb where 日付>=t1.日付)<=7 ) tc on ta.日付=tc.日付 ``` 追記 MySQL8.0は**with**や**分析関数**が使えるので利用すると簡潔になります。 MySQL8.0は手元にないのでpostgresを使用して検証しました。 キーワードとしては**with**と**lag**位ですね。 最終的に相関副問合せを用いてますが、集計を別テーブルに分けて結合する方法もあると思います。 現状インデックスが無いなら使い物にならないほど低速です。 また、日付と証券コードで一意になっていないのも前日比などでは問題です。 ``` with date_range as ( -- 指定した期間内(最新日付より過去7日) select date from b hst where date <= (select max(date) from b) and (select count(*) from b where date>=hst.date)<=7 ) , peak as ( --期間高値:指定した期間内の最高値、最安値 select STOCK_CD, STOCK_NAME, Max(HIGH) max_peak, Min(LOW) min_peak from a where date in (select date from date_range) group by STOCK_CD, STOCK_NAME ) , rasio as ( --前日比 :テーブルB内にある最新日の終値とその前営業日の終値との比較 select date, STOCK_CD , close - lag(CLOSE) over (partition by STOCK_CD order by date) rasio from a ) select pk.* --・高値日 :期間高値を付けた日 , (select max(date) from a where STOCK_CD=pk.STOCK_CD and HIGH=pk.max_peak and date in (select date from date_range) ) --・安値日 :期間安値を付けた日 , (select max(date) from a where STOCK_CD=pk.STOCK_CD and LOW=pk.min_peak and date in (select date from date_range) ) , (select max(rasio) from rasio where date = (select max(date) from b) and STOCK_CD=pk.STOCK_CD ) from peak pk ```