0

私は試してみましたが、これを理解することができませんでした。

オープン、ハイ、ロー、クローズの株価チャートでは、いつでも毎分、5分、10分、時間などのチャートを作成できます。毎分データがあり、オープン、ハイ、ローを選択しようとしています。 、その分ごとのデータから閉じますが、5分ごとです。

私はこれに似たデータを持っています:

__________________________________________________
| Date     | TIME    | TICKER  | Open  | High  | Low   | Close |
| 20121203 | 090000  |  QQQQ   | 23.54 | 24.12 | 23.01 | 23.24 |
| 20121203 | 090100  |  QQQQ   | 23.24 | 24.14 | 22.98 | 24.13 |
| 20121203 | 090200  |  QQQQ   | 24.13 | 25.88 | 23.75 | 25.81 |
| 20121203 | 090300  |  QQQQ   | 25.81 | 25.83 | 24.63 | 24.99 |
| 20121203 | 090400  |  QQQQ   | 24.99 | 25.21 | 23.89 | 24.12 |
| 20121203 | 090500  |  QQQQ   | 24.12 | 24.19 | 21.94 | 22.03 |
| 20121203 | 090600  |  QQQQ   | 22.03 | 22.97 | 20.68 | 21.44 |
| 20121203 | 090700  |  QQQQ   | 21.44 | 24.06 | 19.32 | 23.56 |
| 20121203 | 090800  |  QQQQ   | 23.56 | 25.48 | 23.07 | 25.01 |
| 20121203 | 090900  |  QQQQ   | 25.01 | 28.00 | 24.18 | 27.21 |
| 20121203 | 091000  |  QQQQ   | 27.21 | 27.55 | 24.31 | 24.31 |

時間>=090000(午前9時)09時間00分00秒の行のmax(high)を取得する必要があります。

これと同様に、min(low)が必要です。その後、5分ごとに取得するため、時刻が090400のときに終値を取得します。次の5分の増分のオープンを使用することもできるので、柔軟性があります。

ネストされたSELECTステートメント、複数の結合などを使用しました。問題は、MySQLの実行時間が1行あたり約1秒返されることです。1時間あたり12行(60分/5分=12)があると考えると、これは非常に遅いです。実際にFOREXを実行しているため、取引は24時間、つまり24時間です。それは私に1日あたり288、または1日あたり5分弱を与えます。1年間のデータ(約250取引日)を実行するには、約20時間かかります。より速い方法が必要です。

IDを継続することで、これに対するいくつかの解決策があります。これが最も簡単かもしれませんが、それを行う際にデータが正しいかどうかは100%わかりません。その理由は、金曜日の取引日はニューヨークの通常の営業時間に終了し、東京での最初の取引(米国では午後半ば頃)で始まるためです。

GROUP BYを見てきましたが、データをグループ化して5つのグループを取得する方法がわかりません。時間は各5分のグループから5分以内です。

あなたの考えと議論に感謝します。

ジャロッド

4

2 に答える 2

2

これにより、5 分ごとに最大 (高) と最小 (低) が表示されます。

SELECT Max(high), 
       Min(low) 
FROM   tbl 
GROUP  BY ROUND(Unix_timestamp(Date(Concat(`date`, `time`))) / ( 5 * 60 )) 

Group by 句で、日時列を連結します。のような形になり20121203090000ます。これは、mysql で日付として認識される形式の 1 つです。したがって、それをdate()関数に渡します。次に、に変換されUNIX_TIMESTAMPます。5分のタイムスパンで割ったものです。結果はfloat値になります。ただし、特定の期間については同じ値が必要です。したがって、ROUND(). 浮動小数点値を最も近い整数にします。その動作を理解するには、このクエリを実行します。

SELECT high, 
       low 
       Unix_timestamp(Date(Concat(`date`, `time`))) / ( 5 * 60 ) `5-min span`
       ROUND(Unix_timestamp(Date(Concat(`date`, `time`))) / ( 5 * 60 )) `5-min span rounded`
FROM   tbl 
于 2012-12-10T22:36:13.507 に答える
0

これを試して:

SELECT CONCAT(DATE,SUBSTRING( Time,1,2),"[" ,IF(SUBSTRING( Time,4,1)<5,CONCAT(SUBSTRING( Time,3,1),"0"),CONCAT(SUBSTRING( Time,3 ) ,1),"5")) ,"-" ,IF(SUBSTRING( Time,4,1)<5,CONCAT(SUBSTRING( Time,3,1),"5"),CONCAT(SUBSTRING( Time,3,1) +1,"0")) ,"]") AS timeStr ,MAX(High) ,MIN(LOW) FROM tb1 GROUP BY timeStr;

http://sqlfiddle.com/#!2/6b748/1

于 2012-12-11T03:47:53.273 に答える