SQL Server メモ

SQL Server Express に日経平均株価ヒストリカルデータテーブルをCREATEして、データをINSERTしたときのメモ。
VBAHaskellとvb_ODBC.clsを使用。

1.データの準備

日経平均株価 日足 時系列データ CSVダウンロードから各年のCSVファイルをダウンロードしておく。

2.ファイルを全部つなげた配列を作る

m = catVs(getTextFile("H:\download\indices_I101_1d_2007.csv"), _
          getTextFile("H:\download\indices_I101_1d_2008.csv"), _
          getTextFile("H:\download\indices_I101_1d_2009.csv"), _
          getTextFile("H:\download\indices_I101_1d_2010.csv"), _
          getTextFile("H:\download\indices_I101_1d_2011.csv"), _
          getTextFile("H:\download\indices_I101_1d_2012.csv"), _
          getTextFile("H:\download\indices_I101_1d_2013.csv"), _
          getTextFile("H:\download\indices_I101_1d_2014.csv"), _
          getTextFile("H:\download\indices_I101_1d_2015.csv"), _
          getTextFile("H:\download\indices_I101_1d_2016.csv"))


中身はこんな感じ。
各ファイルにヘッダがついていて、末尾には空白行がある。

printM_ m, 4
日付,始値,高値,安値,終値
2007-12-28,15413.37,15413.37,15240.96,15307.78
2007-12-27,15616.41,15628.31,15535.51,15564.69
2007-12-26,15613.96,15653.54,15559.47,15653.54
printM_  m, -4
2016-01-06,18410.57,18469.38,18064.30,18191.32
2016-01-05,18398.76,18547.38,18327.52,18374.00
2016-01-04,18818.58,18951.12,18394.43,18450.98

3.日付でソートする

各行の先頭10文字を抽出して < で比較する。

si = sortIndex_pred(m, p_less(p_left(,10), p_left(,10)))
permutate m, si


ソート後の状態を見てみる。

printM_  m, 11










2007-01-04,17322.50,17379.46,17315.75,17353.66
printM_  m,-11
2016-12-22,19396.85,19427.67,19327.51,19427.67
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値

空白行が先頭に、ヘッダ行が末尾に集まっている。

4.データの整形

空白行(先頭10行)とヘッダ行(末尾10行)を削除し、各項目をカンマで区切る。

m = tailN(headN(m, -10), -10)
m = mapF(p_Split(, ","), m)

printS m
[Dim1]: 0 -> 2443  : Total Size = 2444

printM_ m,4
  2007-01-04  17322.50  17379.46  17315.75  17353.66
  2007-01-05  17315.53  17327.13  17011.09  17091.58
  2007-01-09  17018.89  17261.02  16983.97  17237.76
  2007-01-10  17192.41  17199.41  16847.57  16942.40

5.ODBCオブジェクトを作ってSQL Serverに接続

set oo = new vb_ODBC
?oo.connect(oo.sqlServer_expr("***-PC\SQLEXPRESS", "sampleDB01"))
True


6.テーブルCREATE

oo.exec "CREATE TABLE NK225 (" & _
                     "MDATE date," & _
                    " OPEN_P numeric(8,2)," & _
                    " HIGH_P numeric(8,2)," & _
                    " LOW_P numeric(8,2)," & _
                    " CLOSE_P numeric(8,2)" & _
                    ");"

7.INSERT文を作る

s = oo.insert_expr_("NK225", Array("MDATE","OPEN_P","HIGH_P","LOW_P","CLOSE_P"), m)
printS s
[Dim1]: 0 -> 2443  : Total Size = 2444
printM_ S,3
INSERT INTO NK225 (MDATE,OPEN_P,HIGH_P,LOW_P,CLOSE_P) VALUES('2007-01-04',17322.50,17379.46,17315.75,17353.66);
INSERT INTO NK225 (MDATE,OPEN_P,HIGH_P,LOW_P,CLOSE_P) VALUES('2007-01-05',17315.53,17327.13,17011.09,17091.58);
INSERT INTO NK225 (MDATE,OPEN_P,HIGH_P,LOW_P,CLOSE_P) VALUES('2007-01-09',17018.89,17261.02,16983.97,17237.76);

8.INSERT文を実行

oo.exec s

9.結果を確認

m1 = oo.select_flat("select * from NK225 order by MDATE").get_data
printS m1
[Dim1]: 0 -> 2443  [Dim2]: 0 -> 4  : Total Size = 12220
printM  m1,5
  2007/01/04   17322.5  17379.46  17315.75  17353.66
  2007/01/05  17315.53  17327.13  17011.09  17091.58
  2007/01/09  17018.89  17261.02  16983.97  17237.76
  2007/01/10  17192.41  17199.41  16847.57   16942.4
  2007/01/11  16958.57  17057.44  16758.46  16838.16
printM  m1,-5
  2016/12/16  19438.39  19439.97  19360.36  19401.15
  2016/12/19  19345.84  19399.26  19307.14   19391.6
  2016/12/20  19367.84   19511.2  19356.81  19494.53
  2016/12/21  19547.28   19592.9  19375.19  19444.49
  2016/12/22  19396.85  19427.67  19327.51  19427.67

h = oo.get_header
printM h
  MDATE    TYPE_DATE
  OPEN_P   NUMERIC  
  HIGH_P   NUMERIC  
  LOW_P    NUMERIC  
  CLOSE_P  NUMERIC