2009年04月07日

分足から日足のデータを表示するSQL

分足のデータをMySQLにロードしたので、そこから日足のデータを表示するSQLを実行してみます。

MySQLには以下のような分足データ1年分が1つのテーブル(eur_usd_2001)に入っているとします。

mysql> SELECT * FROM eur_usd_2001;
+---------------------+--------+--------+--------+--------+
| time | start | high | low | end |
+---------------------+--------+--------+--------+--------+
| 2001-01-03 07:01:00 | 0.9507 | 0.9507 | 0.9507 | 0.9507 |
| 2001-01-03 07:02:00 | 0.9506 | 0.9506 | 0.9505 | 0.9505 |
| 2001-01-03 07:03:00 | 0.9505 | 0.9507 | 0.9505 | 0.9506 |

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

| 2001-12-29 04:46:00 | 0.8837 | 0.8837 | 0.8837 | 0.8837 |
| 2001-12-29 04:51:00 | 0.8837 | 0.8837 | 0.8836 | 0.8836 |
| 2001-12-29 04:56:00 | 0.8836 | 0.8836 | 0.8836 | 0.8836 |
| 2001-12-29 04:57:00 | 0.8837 | 0.8837 | 0.8837 | 0.8837 |
+---------------------+--------+--------+--------+--------+
336554 rows in set (1.04 sec)



日足のデータは以下のようなSQLで表示できます。

mysql> SELECT SUBSTRING(time, 1,10) AS time_s,
-> (SELECT start FROM eur_usd_2001 s WHERE s.time= MIN(m.time)) start,
-> MAX(high) high,
-> MIN(low) low,
-> (SELECT end FROM eur_usd_2001 e WHERE e.time=MAX(m.time)) end
-> FROM eur_usd_2001 m
-> GROUP BY time_s limit 5;
+------------+--------+--------+--------+--------+
| time_s | start | high | low | end |
+------------+--------+--------+--------+--------+
| 2001-01-03 | 0.9507 | 0.9569 | 0.9444 | 0.9462 |
| 2001-01-04 | 0.9460 | 0.9515 | 0.9262 | 0.9442 |
| 2001-01-05 | 0.9443 | 0.9591 | 0.9432 | 0.9517 |
| 2001-01-06 | 0.9516 | 0.9582 | 0.9506 | 0.9575 | 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
| 2001-12-27 | 0.8800 | 0.8867 | 0.8773 | 0.8863 |
| 2001-12-28 | 0.8864 | 0.8864 | 0.8789 | 0.8815 |
| 2001-12-29 | 0.8814 | 0.8839 | 0.8810 | 0.8837 |
+------------+--------+--------+--------+--------+
308 rows in set (1.70 sec)

実行計画はこんな感じ、

mysql> EXPLAIN SELECT SUBSTRING(time, 1,10) AS time_s, (SELECT start FROM eur_usd_2001 s WHERE s.time= MIN(m.time)) start, MAX(high) high, MIN(low) low, (SELECT end FROM eur_usd_2001 e WHERE e.time=MAX(m.time)) end FROM eur_usd_2001 m GROUP BY time_s\G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: m
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 336554
Extra: Using temporary; Using filesort
*************************** 2. row ***************************
id: 3
select_type: DEPENDENT SUBQUERY
table: e
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: func
rows: 1
Extra: Using where
*************************** 3. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: s
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: func
rows: 1
Extra: Using where
3 rows in set (0.00 sec)

当然ながら、テーブルの中の一年分のデータを検索するので、ALLになってしまいますがしょうがないです。


普段はSQLを書くことが無いので、間違っていたり、非効率だったりするかも!?

「間違ってる」とか「ここをこうすれば良くなる」
などといったご意見がありましたら、よろしくお願いします。
m(_ _)m


追記: 今のところ1日が00:00-23:59までの計算になってます。
任意の時間範囲にする場合は、さらに工夫が必要です。



↓励みになりますので、宜しければクリックをお願いします。
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村 
人気ブログランキングへ
posted by よろ at 21:32| Comment(0) | TrackBack(0) | システム構築
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/28331681

この記事へのトラックバック